본문 바로가기

온라인 코딩/정렬(Sort)

[백준] 20920번 영단어 암기는 괴로워

 

문제

 

소스코드

 

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
#include<iostream>
#include<string.h>
#include<map>
#include<vector>
#include<algorithm>
 
using Data = std::pair<size_t, size_t>//나온횟수, 단어길이
using VectorData = std::tuple<std::string, size_t, size_t>//단어, 나온횟수, 단어길이
 
int main() {
    int N{}, M{};
    std::cin >> N >> M;
    std::map<std::string, Data> book;
    std::vector< VectorData> printVector;
 
    for (int i = 0; i < N; ++i) {
        std::string s;
        std::cin >> s;
        if (s.size() < M)continue;
 
        book[s].first++;
        book[s].second = s.size();
    }
 
    for (const auto& i : book) {
        printVector.emplace_back(VectorData{ i.first,i.second.first,i.second.second });
    }
 
    auto cmp = [](const VectorData& lhs, const VectorData& rhs) {
 
        //1. 자주 나오는 단어
        if (std::get<1>(lhs) > std::get<1>(rhs)) {
            return true;
        }
        else if (std::get<1>(lhs) == std::get<1>(rhs)) {
            //2. 단어의 길이
            if (std::get<2>(lhs) > std::get<2>(rhs)) {
                return true;
            }
            //3. 알파벳 사전순
            else if (std::get<2>(lhs) == std::get<2>(rhs)) {
                return std::get<0>(lhs) < std::get<0>(rhs);
            }
        }
        return false;
    };
 
    std::sort(printVector.begin(), printVector.end(), cmp);
 
    for (const auto& i : printVector)
        std::cout << std::get<0>(i) << "\n";
}
 

 

후기

이 문제를 해결하기 위해 사용한 자료구조 및 알고리즘은 Map과 Sort 알고리즘이다.

 

우선 Map을 통해 해당하는 단어가 몇 번 나왔는지 와 그 단어의 길이를 체크할 수 있도록 하였다.

그 이후에는 Map의 데이터를 Vector로 매핑 후 cmp 함수 객체를 만들어 해당 우선순위에 따라 Vector를 정렬시킨 뒤 출력하였다.

 

조건을 넣어서 정렬하는거를 생각보다 많이 안 해봐서  Invalid Comparator오류가 발생했었다. 발생원인은 sort에 사용하는 비교 함수는 stric weaak ordering을 만족해야 하기 때문에 a==b 이면 a> b 도 false a <b 도 flase 여야 된다.

 

Map 자료구조 하나로 해결해볼려고 하다가 시간 초과가 생길 거 같아서 이것저것 수정하다 보니 많은 시간을 사용했다.

해결하는데 걸린 시간: 33분

 

 

출처 및 레퍼런스

문제 링크: 20920번: 영단어 암기는 괴로워 (acmicpc.net)

 

관련 글

[자료구조 알고리즘/정렬 알고리즘(Sort)] - [알고리즘] 퀵 정렬(Quick Sort)

[온라인 코딩/힙(Heap)] - [백준] 1427번 소트인사이드

[온라인 코딩/탐색(Search)] - [백준] 1620번 나는야 포켓몬 마스터 이다솜

[프로그래밍/Modern C++] - [C++] 연관 컨테이너 맵(map)

 

 

'온라인 코딩 > 정렬(Sort)' 카테고리의 다른 글

[백준] 2751번 수 정렬하기 2  (1) 2020.01.10
[백준] 2750번 수 정렬하기  (1) 2020.01.02
[백준] 2752번 세수정렬  (1) 2020.01.02