프로그래머스/Level_2

[Level_2 / C++ / 카카오] 메뉴 리뉴얼

배발자 2022. 1. 28.
반응형
 

<next_permutation> 모든 경우의 수 정렬

벡터를 정렬할 때 정렬 될 수 있는 모든 경우의 수를 물어보는 문제가 있다. 이러한 경우 해당 함수를 사용한다. 즉, A B C 를 정렬하고 싶은데 모든 경우를 정렬하면, ABC ACB BAC BCA CAB CBA 순으로 정

baebalja.tistory.com


  1. course 사이즈 만큼 for문 돌리기
  2. 각 손님이 주문한 메뉴가 course 사이즈보다 작으면 continue; 
  3. next_permutation 사용해서 변화되는 인덱스 값들에 해당하는 문자들로 문자열을 만들고 map에 저장 
  4. next_permutation 종료된 후 제일 큰 값을 갖는 key값을 answer에 push_back;
  5. 알파벳 오름차순으로 정렬     

#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp (pair<string,int>a,pair<string,int>b){
    return a.second>b.second; 
}
vector<string> solution(vector<string> orders, vector<int> course) {
    vector<string> answer;
    for(int i=0; i<course.size(); i++){
        map <string, int> m; 
        for(int j=0; j<orders.size(); j++){
            string s= orders[j]; 
            if(course[i]>s.size())continue; 
            sort(s.begin(),s.end());             
            vector <bool> check (s.size(),0); 
            for(int k=s.size()-course[i]; k<s.size(); k++) check[k]=1;             
            do{
                string s1 =""; 
                for(int k=0; k<s.size(); k++){
                    if(check[k])s1+=s[k]; 
                }
                m[s1]++; 
            }while(next_permutation(check.begin(),check.end())); 
        }
        if(m.empty())continue;                
        vector <pair<string, int>> v(m.begin(),m.end()); 
        sort(v.begin(),v.end(), cmp); 
        if(v.begin()->second==1)continue; 
        for (auto x : v)cout<< x.first <<" "<<x.second<<endl; 
        int compare = v.begin()->second; 
        for(auto x : v){
            if(x.second==compare)answer.push_back(x.first); 
            else break; 
        }
    }
    sort(answer.begin(),answer.end()); 
    return answer;
}

 

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

반응형

댓글