문제 링크 : 메뉴 리뉴얼
딱 보자마자 조합이 떠올랐던 문제이다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
void check(string s, string temp, map<string, int> &m, int index, int cnt, int start) {
if(index==cnt) {
m[temp]++;
return;
}
for(int i=start ; i<s.size() ; i++) {
check(s, temp+s[i], m, index, cnt+1, i+1);
}
}
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
for(int k=0 ; k<course.size() ; k++) {
int index = course[k];
map<string, int> m;
for(int i=0 ; i<orders.size() ; i++) {
// 미리 정렬해서 순서에 상관없게 만들기
sort(orders[i].begin(), orders[i].end());
check(orders[i], "", m, index, 0, 0);
}
vector<string> arr;
int maxnum=0;
for(map<string, int>::iterator it=m.begin() ; it!=m.end() ; it++) {
if(it->second>=2) {
if(maxnum<it->second) {
arr.clear();
arr.push_back(it->first);
maxnum = it->second;
} else if(maxnum==it->second) {
arr.push_back(it->first);
}
}
}
for(int i=0 ; i<arr.size() ; i++) {
answer.push_back(arr[i]);
}
}
sort(answer.begin(), answer.end());
return answer;
}