알고리즘 문제/C++

[백준] 1181번: 단어정렬 - C++

lingk 2022. 3. 31. 23:55

문제

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

 

1181번: 단어 정렬

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

www.acmicpc.net


설명

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;

bool compare(string a, string b)
{
    if(a.size()==b.size())
    {
        return a<b;
    }
    else return a.size()<b.size();
}

int main()
{
    int N;
    vector<string> words;
    cin>>N;
    
    for(int i = 0; i<N;i++)
    {
        string tmp;
        cin>>tmp;
        words.push_back(tmp);
    }
    sort(words.begin(), words.end(), compare);
    words.erase(unique(words.begin(), words.end()),words.end());
    
    for(int i = 0; i<words.size();i++)
    {
        cout<<words[i]<<endl;
    }
}

4번만에 맞았다!! 

처음에는 중복된 값을 제거하지 않아서 틀렸다.

두번째에는 unique를 사용하고, 출력은 그대로 N으로 해서 틀렸다.

세번째에는 출력 범위만 words.size()로 수정해서 틀렸다.

마지막에는 unique에 erase까지 추가해서 맞을 수 있었다.

 

이 문제에서 공부한 것은 sort함수를 사용할때 정렬하는 기준을 만드는 함수 구현, 벡터에서 중복제거 이렇게 두가지 이다.

 

sort함수에서 정렬하는 기준으로 사용할 함수의 return값은 bool type 이다.

나는 문자열의 길이가 같으면 사전순으로, 같지 않으면 길이순으로 정렬하도록 함수를 구현하였다.

bool compare(string a, string b)
{
    if(a.size()==b.size())
    {
        return a<b;
    }
    else return a.size()<b.size();
}

 

벡터의 중복제거

unique가 끝났으면 반환되는값은 vector의 쓰레기값의 첫번째 위치이다.

erase함수에는 삭제할 처음위치와 마지막위치를 인자로 갖는다.

따라서 unique함수를 실행한 결과와, 벡터의 마지막 위치를 erase함수의 인자로 넣어주면 중복된 원소들이 제거된다!

words.erase(unique(words.begin(), words.end()),words.end());

 

반응형