문제 출처:

https://programmers.co.kr/learn/courses/30/lessons/72411

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

조합, 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<stringint> 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 == 1continue;
        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

+ Recent posts