[프로그래머스 level2] 메뉴 리뉴얼 (C++)
조합과 map을 사용해서 해결할 수 있는 문제이다. (프로그래머스 level2)
문제는 다음과 같다.
메뉴 리뉴얼
어떻게 풀었는가?
- next_permutation()으로 조합구함
- map에 해당 문자열을 추가하고 문자열 등장 횟수 확인
- 가장 많이 나온 문자열을 출력
조건
- 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함한다.
- 2명 이상의 코스요리가 없을 경우에는 해당 개수의 코스요리는 출력하지 않는다.
- 가장 많이 주문된 메뉴 구성이 여러개라면, 모두 배열에 담아 return 한다.
- 오름차순으로 정렬해서 return 한다.
구현
- 해당 손님이 시킨 단품메뉴의 개수만큼 vector를 할당한다. (len)
- 구해야하는 코스요리의 개수(cnt)만큼 vector에 true를 할당한다.
- 이 vector에 대해서 next_permutation을 반복한다. -> 조합구하기
- 조합을 구해 true인 문자를 모아 문자열로 만들고 map 사용
- 이미 있는 문자열 -> m[tmp]++;
- 없는 문자열 -> m.insert({tmp,1});
- 가장 많이 나온 문자열을 answer에 추가한다.
1~5 반복하면됨
코드
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
map <string,int> m;
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
for(int i=0; i<course.size(); i++)
{
int cnt = course[i];
for(int j=0; j<orders.size(); j++)
{
int len = orders[j].length();
if(len < cnt) continue;
sort(orders[j].begin(), orders[j].end());
vector <bool> v(len-cnt, false);
v.insert(v.end(), cnt, true);
do{
string tmp = "";
for(int k=0; k<len; k++)
{
if(v[k]){
tmp += orders[j][k];
}
}
if(m.find(tmp) == m.end()){
m.insert({tmp,1});
}
else{
m[tmp]++;
}
}while(next_permutation(v.begin(), v.end()));
}
int maxCnt = 0;
for(auto itr=m.begin(); itr!=m.end(); itr++)
{
if(maxCnt < itr->second) maxCnt = itr->second;
}
if(maxCnt==1) continue;
for(auto itr=m.begin(); itr!=m.end(); itr++)
{
if(maxCnt == itr->second)
{
answer.push_back(itr->first);
}
}
m.clear();
}
sort(answer.begin(), answer.end());
return answer;
}
Author And Source
이 문제에 관하여([프로그래머스 level2] 메뉴 리뉴얼 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mar_f/프로그래머스-메뉴리뉴얼저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)