https://programmers.co.kr/learn/courses/30/lessons/72411
코딩테스트 연습 - 메뉴 리뉴얼
레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서
programmers.co.kr
코딩테스트 연습 > 2021 KAKAO BLIND RECRUITMENT > 메뉴 리뉴얼
식빵맘님의 블로그를 참고해서 조합에 대한 공부 후, 문제 풀이에 적용했다. (링크는 아래쪽에)
1. orders의 문자들을 각각 알파벳 오름차순으로 정렬
2. Combination(조합)을 이용해서 course의 수에 해당하는 문자를 menu(=unordered_map)에 추가
3. 각 course당 최댓값을 뽑아서, 최댓값에 해당하는 문자들을 모두 result에 추가
4. result에 있는 문자들의 순서를 알파벳 오름차순으로 정렬
main포함 코드(c++)
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
unordered_map<string, int> menu;
vector<string> result;
void Combination(string arr, vector<char> comb, int index, int depth)
{
if (depth == comb.size())
{
string text = "";
for(int k=0;k<comb.size();k++)text += comb[k];
menu[text]++;
return;
}
else
{
for(int i = index; i < arr.size(); i++)
{
comb[depth] = arr[i];
Combination(arr, comb, i + 1, depth + 1);
}
}
}
vector<string> solution(vector<string> orders, vector<int> course) {
for(int i=0;i<orders.size();i++)sort(orders[i].begin(), orders[i].end());
for(int i=0;i<orders.size();i++){
for(int j=0;j<course.size();j++){
if(orders[i].size() < course[j]) continue;
vector<char> comb(course[j]);
Combination(orders[i], comb, 0, 0);
}
}
for(int i=0; i<course.size(); i++){
//메뉴에서 first의 길이가 2인것중에 최댓값, 3인것중에 최댓값, 4인것 중에 최댓값
int Max = 0;
for(auto iter : menu ){
if(iter.first.size() == course[i]) Max = max(Max, iter.second);
}
for(auto iter : menu ){
if(iter.second == Max && iter.first.size() == course[i] && Max >= 2) result.push_back(iter.first);
}
}
sort(result.begin(), result.end());
return result;
}
int main()
{
vector<string> orders = {"ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"};
vector<int> course = {2,3,4};
// vector<string> orders = {"ABCDE", "AB", "CD", "ADE", "XYZ", "XYZ", "ACD"};
// vector<int> course = {2,3,5};
// vector<string> orders = {"XYZ", "XWY", "WXA"};
// vector<int> course = {2,3,4};
solution(orders, course);
return 0;
}
어떻게 풀어야하는지 감이 잘 잡히지 않아서 질문게시판을 참고해서 조합을 해서 풀면 된다는 걸 깨달은 후 접근했다.
솔루션을 생각하는 힘이 아직 많이 부족한 것 같다. 모르면 바로 검색하는 것 보다 혼자 좀더 생각해봐야겠다. ㅠㅠ
2시간은 넘게 걸린것 같다,,ㅠㅠ
참고한 블로그
https://ansohxxn.github.io/algorithm/combination/
'코딩테스트 연습 > programmers' 카테고리의 다른 글
[Programmers] 프로그래머스 추석 트래픽 (0) | 2022.02.07 |
---|---|
[Programmers]프로그래머스 카카오프렌즈 컬러링북(c++) (0) | 2022.02.07 |
[Programmers] 프로그래머스 오픈채팅방(c++) (0) | 2022.02.03 |
[Programmers] 이분탐색 > 입국심사(c++) (0) | 2022.01.31 |
[Programmers]그래프 > 순위(c++) (0) | 2022.01.28 |