내 오류
중복을 제거하고자 하는 목적의 반복문을 제대로 제어하지 못 했음
중복되는 특정부분을 continue로 넘겨버리겠다는 생각으로 i 인덱스를 중심으로 (앞)i-1 , (뒤) i+1을 비교해서 중복을 넘겨버리려고 했으나 오류.
급하게 풀어보면 이렇게 실수 하는 것 같다.
늘 반복문의 형식을 i =0 , i < n; 형식으로 할 것이라면 반복문을 쓰기전 생각을 좀 더 해야겠다.
for (int i = 0; i < n; i++) {
if (ss[i-1] == ss[i] && ss[i] == ss[i+1]) {
continue;
}
cout << ss[i] << endl;
}
위 코드의 문제점
- i=0 일 경우 i-1이 마이너스 인덱스로 가게된다는 점이다.
- i=n-1 일 경우 s[n]를 비교에 사용하게 된다. (n은 포함이 안 된다.)
이런 반복문을 사용하지 않는 Best Practice
cout << ss[0] << endl;
for (int i = 1; i < n; i++) {
if (ss[i] != ss[i - 1]) {
cout << ss[i] << endl;
}
}
- 괜히 0이 포함되면 마이너스로 넘어갈 가능성이 생긴다. -> 0은 cout 시킨다.
- 앞 뒤로 비교하지 말고 뒤로만 비교해라, 왜냐하면 반복문의 i는 앞으로 ++ 되어가기 때문이다.
정답
정답은 아래와 같다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(string a,string b) {
if (a.size() == b.size()) {
return a < b;
}
return a.size() < b.size();
}
int main() {
string ss[20000];
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> ss[i];
}
sort(ss,ss+n,cmp);
cout << ss[0] << endl;
for (int i = 1; i < n; i++) {
if (ss[i] != ss[i - 1]) {
cout << ss[i] << endl;
}
}
return 0;
}