본문 바로가기
알고리즘/정렬

[ C++백준] 실버 5/1181번 단어정렬

by Meaning_ 2022. 2. 18.
728x90
반응형

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

 

1181번: 단어 정렬

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

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include<string>
#include<istream>
#include <vector>;
#include<algorithm>;
 
using namespace std;
 
 
 
bool compare(string a, string b) {
    int aLen = a.length();
    int bLen = b.length();
    if (aLen == bLen) {
 
        for (int i = 0; i < aLen; i++) {
            char a1 = a[i];
            char b1 = b[i];
            if (a1 != b1) { //i im it처럼 첫번째만 같은경우가 있기에
                //for문 돌려주면서 둘이 다른 부분을 찾았을 때 둘이 다른 부분을 기준으로
                //아스키코드 오름차순 정렬 
                return a1 < b1; //아스키코드 순으로 정렬
            }
        }
 
        //char a1 = a[0];
        //char b1 = b[0]; 만 해주면 wait wont 에서 잘못된 값 출력
        
    }
    return aLen < bLen;//길이 순으로 정렬 
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    int n;
    cin >> n;
    vector<string>v;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
 
        //중복으로 받아주는 경우 해결해야함  --> uique로 할경우
        //vector크기가 13, 근데 find로 하면 vector크기 11
        if (find(v.begin(), v.end(), s) == v.end()) {
            v.push_back(s);
        }
    }
 
 
    sort(v.begin(), v.end(), compare);
    
    
 
    for (int i = 0; i < v.size();i++) {
        cout << v[i] << '\n';
    }
    
}
cs

중요한것은 두가지가 있다. 

1) c++의 sort함수 compare사용

2) 출력 초과 방지하기 위해 처음부터 중복인원소 쳐내야함 그때 유용한게 find (vector 원소 찾기 할때 쓰임)

 

 

길이가 짧은 것부터 정렬하고, 길이가 같으면 사전순으로 정렬해야한다는 조건을 보고 바로 자바의 

comparator를 떠올렸다. 하지만 이건 c++이기에 어떻게 해야하는지 찾아보다 sort함수의

comparte가 비슷한 기능을 하고 있다는 것을 알게되었다.  매개변수 2개를 비교하고 ->오름차순으로

정렬하주는 방식이 똑같았다.

 

1
2
3
4
5
6
7
8
9
10
bool compare(string a,string b){
    if(a.length()==b.length()){
        for(int i=0;i<a.length();i++){
            if(a[i]!=b[i]){
                return a[i]<b[i];
            }
        }
    }
    return a.length()<b.length();
}
cs

 

여기서 for문을 왜 넣어주냐고 생각이 들 수도 있다.

난 처음에 a[0] b[0]으로만 해서 첫번째 글자만 비교해줬는데 wait wont 처럼 두번째 글자부터 차이를 보이는 애들도 있기에 for문을 돌려줘서 i번째에서 둘이 차이가 나타난다면 그 때 오름차순 정렬을 해준다.

 

길이가 다른 경우 길이를 기준으로 오름차순 정렬 해주면 된다.

 

두번째는 find이다. 이건 vector에서 해당 원소가 존재하는지 확인하는 기능을 한다.

find(v.begin(),v.end(),찾을 대상) 의 형태를 하며

리턴값이 v.end()인경우 해당원소가 존재하지 않는 것이고

리턴값이 v.end()가 아닌 경우 해당원소가 존재하는 것으로 판별할 수 있다. 

 

 

find함수, sort함수의 compare 참고 

https://9x211x2.tistory.com/17

 

[C++] vector 원소 찾기, 해당 인덱스 찾기 (find 함수)

1. vector내에 해당 원소가 존재하는지 확인 find(v.begin(), v.end(), 찾을 대상) 리턴 값이 v.end()인 경우 => 해당 원소가 존재하지 않는 것 리턴 값이 v.end()가 아닌 경우 => 해당 원소 존재하는 것 2. vecto..

9x211x2.tistory.com

https://leeeegun.tistory.com/5

 

[C++ STL] Sort() 사용법 및 compare 함수

sort 함수는 C++ STL에서 제공하는 함수로써 정렬에 이용되며 헤더를 include 하여 사용 할 수 있다. 각종 알고리즘 문제에서도 간단하게 사용 할 수 있어서 자주 쓰이는데, 이 함수의 시간 복잡도는 n

leeeegun.tistory.com

 

728x90
반응형

댓글