문제 출처:
https://programmers.co.kr/learn/courses/30/lessons/72411
조합, map을 이용해서 풀이할 수 있다.
코스요리를 이루는 메뉴의 개수가 곧 조합으로 뽑아야 할 개수에 해당하기 때문에, 뽑아주고, 2명이상의 사람에게 가장 많이 뽑힌 메뉴들을 개수별로 벡터에 저장하고, 오름차순으로 사전순 정렬을 해주면 된다.
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 <bits/stdc++.h>
using namespace std;
map<string, int> mp;
vector<string> solution(vector<string> ord, vector<int> crs) {
vector<string> ans;
for(int i = 0 ; i < crs.size() ; i++){
int cnt = crs[i];
for(int j = 0 ; j < ord.size() ; j++){
string curOrd = ord[j];
sort(curOrd.begin(), curOrd.end());
if(curOrd.length() < cnt) continue;
vector<int> tmp;
for(int k = 0 ; k < cnt ; k++){
tmp.push_back(0);
}
for(int k = cnt ; k < curOrd.length() ; k++){
tmp.push_back(1);
}
do{
string str ="";
for(int k = 0 ; k < curOrd.size() ; k++){
if(tmp[k] == 0){
str += curOrd[k];
}
}
if(mp.find(str) == mp.end()){
// map에 없으면
mp.insert({str, 1});
}
else{
mp[str]++;
}
}while(next_permutation(tmp.begin(), tmp.end()));
}
// cur개의 메뉴를 뽑을때, 최대 빈도수로 등장한 메뉴조합
int maxCnt = 1;
for(auto itr = mp.begin() ; itr != mp.end() ; itr++){
// cout << itr->first << " = " << itr->second << '\n';
if(itr->second > maxCnt){
maxCnt = itr->second;
}
}
if(maxCnt == 1) continue;
for(auto itr = mp.begin() ; itr != mp.end() ; itr++){
if(itr->second == maxCnt){
ans.push_back(itr->first);
}
}
mp.clear();
}
sort(ans.begin(), ans.end());
return ans;
}
|
cs |
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스: N개의 최소공배수(C++) (0) | 2021.10.06 |
---|---|
프로그래머스: 뉴스 클러스터링(C++) (0) | 2021.10.06 |
프로그래머스: 베스트앨범 (C++) (0) | 2019.10.30 |
프로그래머스: 단어 변환 (C++) (0) | 2019.09.29 |
프로그래머스: 네트워크 (C++) (0) | 2019.09.28 |