BOJ) 1181번 단어 정렬 cpp

내 오류

중복을 제거하고자 하는 목적의 반복문을 제대로 제어하지 못 했음
중복되는 특정부분을 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;
}