https://programmers.co.kr/learn/courses/30/lessons/72411
코딩테스트 연습 - 메뉴 리뉴얼
레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서
programmers.co.kr
[난이도] level2
[유형] 구현
[풀이]
순수 구현 문제입니다.
모든 order를 정렬 뒤에 순회하면서 비트마스크를 이용해
모든 요리 코스 조합이 몇개 존재하는지 map에 저장하였습니다.
mp["코스"]=등장한 개수 (mp["AB"]=2) 와 같이 저장됩니다.
그 뒤 courses 배열을 순회하면서
코스에 포함된 요리 개수가 courses[i] 이면서 등장한 코스의 개수가 2개 이상인 것들을
vector에 <등장한 개수,"코스"> 형식으로 저장 한 뒤 오름차순으로 정렬합니다.
vector에서 등장한 개수가 큰 코스들은 answer vector에 저장해주면 됩니다.
모든 courses를 확인 후
answer를 정렬해주면 최종 정답입니다.
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <iostream>
#include <cstdio>
using namespace std;
map<string,int> mp;
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
for(auto& order : orders){
sort(order.begin(),order.end());
int sz = order.size();
for(int i=0;i<(1<<sz);i++){
vector<bool> flag(sz);
string tmp;
for(int j=0;j<sz;j++){
if((i&(1<<j))>0) flag[j]=1;
}
for(int j=0;j<sz;j++){
if(flag[j]) tmp.push_back(order[j]);
}
if(tmp.size()>=2) {
mp[tmp]++;
}
}
}
for(auto c : course){
vector<pair<int,string>> v;
for(auto& p : mp){
if(p.first.size()==c && p.second>=2){
v.push_back({-p.second,p.first});
}
}
if(v.empty()) continue;
sort(v.begin(),v.end());
int minV = v[0].first;
for(auto& p : v){
if(minV!=p.first) break;
answer.push_back(p.second);
}
}
sort(answer.begin(),answer.end());
return answer;
}
https://github.com/has2/Problem-Solving/blob/master/programmers/level2/메뉴 리뉴얼.cpp
'Problem-Solving > Programmers' 카테고리의 다른 글
[프로그래머스][level2] 후보키 (C++) (0) | 2021.08.06 |
---|---|
[프로그래머스][level2] 순위 검색 (C++) (0) | 2021.08.06 |
[프로그래머스][level2] 행렬 테두리 회전하기 (C++) (0) | 2021.08.06 |
[프로그래머스][level2] 거리두기 확인하기 (C++) (0) | 2021.08.06 |
[프로그래머스] Level2 - 가장 큰 수 (C++) (0) | 2020.07.28 |