본문 바로가기
대딩/프로그래머스풀이

[프로그래머스 lv2] 메뉴 리뉴얼 풀이

by 경아ㅏ 2022. 3. 16.

해설

n개의 단품으로 이루어진 모든 코스 조합을 찾은 후,

해당 코스가 주문에서 몇번 등장하였는지 카운트하여 가장 많은 주문을 받은 코스를 정답 배열에 추가하면 된다.

 

 

전체 코드

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <tuple>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <climits>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;
using ii = pair<int, int>;
using is = pair<int, string>;
using iii = tuple<int, int, int>;

#define X first
#define Y second


bool search(string s1, string s2) {
    
    for (auto c : s1) {
        if (s2.find(c) == string::npos) return false;
    }
    return true;
}


void combination(int k, int n, vector<int>& arr, const vector<string>& orders, vector<is>& v) {
    
    if (k == n) {
        
        //n개의 단품으로 이루어진 코스
        string s = "";
        for (int i=0; i<k; i++) s += (arr[i]+'A');
    
        //해당 코스가 주문에서 몇번 등장하는지 카운트
        int cnt = 0;
        for (auto ord : orders) {
            if (search(s, ord)) cnt++;
        }   

        //v에 저장 
        v.push_back({cnt, s});
        return ;
    }
    
    int st = 0;
    if (k != 0) st = arr[k-1]+1;
    for (int i=st; i<26; i++) {
        arr[k] = i;
        combination(k+1, n, arr, orders, v);
    }
}


vector<string> solution(vector<string> orders, vector<int> course) {

    vector<string> ans;
    
    for (auto n : course) {
        
        vector<is> v;
        vector<int> arr(15, 0);

        //n개의 단품으로 이루어진 코스 조합을 찾아 해당 코스가 몇개의 주문에서 등장하는지 v에 저장
        combination(0, n, arr, orders, v);
        
        //가장 많은 주문을 받은 코스 파악
        int mx = 0;
        for (auto [t, s] : v) mx = max(t, mx);
        if (mx < 2) continue;
        
        //가장 많은 주문(2번 이상)을 받은 코스들을 ans에 추가
        for (auto [t, s] : v) if (t == mx) ans.push_back(s);
    }

    //정렬
    sort(ans.begin(), ans.end());
    return ans;
}

 

댓글