https://www.acmicpc.net/problem/1181
이미 문자열이 정렬된 상태에서는 '바로 이전 인덱스'에 대해서만 중복 여부를 검사하면 되는데, 이것을 깨닫지 못하고 나는 for문을 중첩해서 내부 루프의 인덱스 범위를 j = 0~(i-1) 이렇게 잡고, i 이전의 모든 원소들에 대해 중복 검사를 하려고 했다.
차근차근 조건이 주어진 순서대로 풀어야겠다. 괜히 마지막 조건을 먼저 생각하다가 머리만 더 복잡해졌다. 일단 정렬을 다 하고 나서는! 바로 이전 인덱스랑만 문자열 중복 여부를 따지면 된다!
참고한 풀이: https://cryptosalamander.tistory.com/51
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool compare(string a, string b) {
// 문자열의 길이가 같으면 사전 순으로 정렬
if (a.length() == b.length())
return a < b; // a가 b보다 사전 순으로 앞에 오면 true
// 기본적으로는 문자열 길이 순으로 정렬
return a.length() < b.length(); // a가 b보다 짧으면 true
}
int main()
{
// 문자열 개수 입력 받기
int n;
cin >> n;
// n개의 문자열로 이루어진 배열
string* arr = new string[n];
for (int i = 0; i < n; i++)
cin >> arr[i];
// 사용자 정의 함수로 정렬하기
sort(arr, arr + n, compare);
cout << arr[0] << "\n";
for (int i = 1; i < n; i++) {
// 이전 문자열과 같으면 다음 인덱스로 넘어가기
if (arr[i - 1] == arr[i])
continue;
else // 이전 문자열과 다르다면 출력하기
cout << arr[i] << "\n";
}
return 0;
}