https://school.programmers.co.kr/learn/courses/30/lessons/72411
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
// orders 배열의 각 원소는 크기가 2이상 10 이하인 문자열 -> 음식을 10개 초과로 시킬 수 없음
// index 는 음식의 수를 말함
// combination[3] -> 3가지로 만들 수 있는 조합
unordered_map<string, int> combination[11]; // 음식이름 , 횟수
int mxCount[11];
void comb(string str, int cnt, string result) {
if (cnt == str.size()) {
// num : 메뉴개수
// result : 메뉴조합
// 최대인지 확인
int num = result.size();
combination[num][result]++;
mxCount[num] = max(mxCount[num], combination[num][result]);
return;
}
// 조합
// 해당 문자 선택함
// 해당 문자 선택하지 않음
comb(str, cnt + 1, result + str[cnt]);
comb(str, cnt + 1, result);
}
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
for (auto order : orders) {
// 조합 만들 때도 오름차순으로 만들어야 함
sort(order.begin(), order.end());
comb(order, 0, "");
}
// course 에 맞는 것을 뽑아서 넣음
// 2명 이상의 손님이 시켜야 함
for (auto num: course){
for (auto x : combination[num]) {
if (x.second == mxCount[num] && x.second >= 2) {
answer.push_back(x.first);
}
}
}
// 결과도 오름차순 정렬
sort(answer.begin(), answer.end());
return answer;
}
문제가 쉽지 않아서 다른 사람의 풀이를 참고했다
unordered map로 배열을 만드는 개념이 낯설어서 처음 이해하는 데 시간이 좀 걸렸다
// index 는 음식의 수를 말함
// combination[3] -> 3가지로 만들 수 있는 조합
unordered_map<string, int> combination[11]; // 음식이름 , 횟수
이 문제에서 핵심적인 부분이다
// 조합
// 해당 문자 선택함
// 해당 문자 선택하지 않음
comb(str, cnt + 1, result + str[cnt]);
comb(str, cnt + 1, result);
넣는 경우 넣지 않는 경우를 재귀를 돌면서 글자수를 완성시킨다
if (cnt == str.size())
{
// num : 메뉴개수
// result : 메뉴조합
// 최대인지 확인
int num = result.size();
combination[num][result]++;
mxCount[num] = max(mxCount[num], combination[num][result]);
return;
}
// course 에 맞는 것을 뽑아서 넣음
// 2명 이상의 손님이 시켜야 함
for (auto num: course){
for (auto x : combination[num]) {
if (x.second == mxCount[num] && x.second >= 2) {
answer.push_back(x.first);
}
}
}
combination[num]은 num 만큼의 글자수로 이뤄진 글자 맵을 가져온다
그 요소 중에 해당 요소의 mx값을 저장해놓은 배열의 값과 일치하는 요소를 가져온다
iterator로 접근하기 때문에 pair형태로 하나씩 접근하여 x.first / x.second로 접근가능하다
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!