문제
소스코드
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 |