본문 바로가기

Problem Solving/백준

[백준/C++] 1181번 풀이

문제 설명



문제 풀이


2만개의 단어면 정렬 후 출력을 해도 문제가 없을 것이라고 생각했다 (NlogN가 2억 미만이므로)

중복을 따로 제거하기 귀찮아서 set을 이용하였고 set의 정렬방법을 따로 정의해주었다.

이 때 set은 operator를 overloading할 때 const를 쓰지 않으면 컴파일 오류가 나는데 원인은 아래 링크에서 설명하겠다.

https://readble-ko.tistory.com/185

 

[C++] set operator 사용 시 const가 필요한 이유

백준 문제를 풀다가 신기한 것을 발견했다. vector나 배열의 비교 연산자를 오버로딩할 때는 const가 없어도 컴파일 오류가 없었는데, set의 비교 연산자를 오버로딩하려고 하니 const가 없을 때만 컴

readable-ko.site


코   드


#include <iostream>
#include <set>
using namespace std ;

struct cmp
{
    bool operator()(string a, string b) const {
        if(a.length() == b.length()) return a < b ;
        return a.length() < b.length() ;
    }
};

int main()
{
    int N ;
    cin >> N ;
    set<string, cmp> s ;
    string str ;

    for(int i = 0 ; i < N ; i++) {
        cin >> str ;
        s.insert(str) ;
    }

    for(auto str : s)
        cout << str << "\n" ;
}

느낀점: 새롭게 set에 대해서 공부하게 되는 시간이었다.

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

 

1181번: 단어 정렬

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

www.acmicpc.net