알고리즘/알고리즘 문제 풀이

(C++) 백준 1181번 - 단어 정렬

용꿀 2023. 4. 10. 01:16

문제 링크 : https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

문제 풀이

sort 함수와 커스텀 비교 함수를 사용하여 단어를 정렬하여 풀이를 진행하였다.

다만 C++ vector에서의 중복 제거를 처음 사용해 보아서 조금 어려움도 있었다.

 

※ unique 함수는 중복된 값들을 뒤로 보내고, 중복된 값들의 시작 위치를 반환한다.

※ erase 함수는 시작 위치부터 종료 위치까지의 값을 모두 제거한다.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int n;

bool cmp(string &s1, string &s2){ // 커스텀 비교 함수
    if(s1.size() != s2.size()) return s1.size() < s2.size();
    else return s1 < s2;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    vector<string> v(n);

    for(int i = 0; i < n; ++i) cin >> v[i]; // 입력
    sort(v.begin(), v.end(), cmp); // 정렬
    v.erase(unique(v.begin(), v.end()), v.end()); // 중복 제거
    for(string s : v) cout << s << "\n"; // 출력
}