C++:: 프로그래머스 < 메뉴 리뉴얼 >

jahlee·2023년 7월 2일
0

프로그래머스_Lv.2

목록 보기
61/106
post-thumbnail

세트 메뉴를 구상하는 문제인데 조심해야하는 부분은 주어진 코스의 개수를 만족하는 조합중 가장 많이 골라진 세트메뉴를 answer에 넣어주어야 한다는 점이다.(여러개면 다 넣어준다.) 이부분을 제외하면 크게 어렵지 않다.

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

unordered_map<string,int> m;

void dfs(int idx, string tmp, string order) {
    if (tmp.size() > order.size()) {
        return ;
    }
    m[tmp]++;
    for (int i = idx; i < order.size(); i++) {
        dfs(i+1, tmp+order[i], order);
    }
}

vector<string> solution(vector<string> orders, vector<int> course) {
    vector<string> answer;
    for (auto order : orders) {
        sort(order.begin(), order.end());//order가 정렬이 안되어있기 때문에 정렬
        dfs(0, "", order);// 조합할 수 있는 모든 메뉴를 m에 넣어준다.
    }
    for (auto setSize : course) {
        int mostOrdered = 0;// 가장 많이 선택된 횟수를 저장
        for (auto menu : m) {
            if (menu.first.size() == setSize)// 코스의 사이즈를 만족하면서 가장 많이 선택된 횟수 갱신
                mostOrdered = max(mostOrdered, menu.second);
        }
        if (mostOrdered <= 1) continue;// 횟수가 최소 2이상이어야한다.
        for (auto menu : m) {
            if (menu.first.size() == setSize && menu.second == mostOrdered)
                answer.push_back(menu.first);// 조건에 부합한다면 넣어준다.
        }
    }
    sort(answer.begin(),answer.end());// 사전순으로 정렬
    return answer;
}

0개의 댓글