▷ 문제 : 2021 KAKAO BLIND RECRUITMENT - 메뉴 리뉴얼 LV.2
▷ 해결 날짜 : 2022.03.14
▷ 소요 시간 : 48분
▷ 풀이 과정 :
문제를 한차례 읽어보니 이 문제는 조합과 해시를 가지고 풀 수 있겠다는 느낌이 들어, 그 느낌 그대로 풀이를 진행하였다.
여기서 알아둬야 할 점이 몇 개 있다. (개인적으로 중요하게 생각한 부분들)
1. 주문이 들어온 orders 배열과, 주인장이 만들고 싶은 코스요리의 구성 메뉴 개수 course 배열이 주어진다.
2. 각 메뉴는 A~Z의 알파벳 대문자로 중복되어 들어가지 않는다.
3. 최소 두 가지 이상의 코스요리를 만들 것이며, 최소 2명 이상의 손님으로부터 주문된 메뉴로만 조합한다.
4. 가장 많이 주문된 메뉴 구성만 담으며 여러 개일 경우 여러 개 전부 담는다.
5. 결괏값은 오름차순으로 정렬해서 반환한다. (단. 배열의 각 원소에 저장된 문자열 또한 알파벳 오름차순으로 정렬한다.)
이렇게 5가지만 알고 가면 구현하는데 큰 어려움은 없다.
▷ 구현
function solution(orders, course) {
let answer = [];
course.forEach(num => {
const menus = new Map();
orders.forEach(order => {
const combinations = getCombination(order.split('').sort(), num);
combinations.forEach(combs => {
const comb = combs.join('');
menus.set(comb, menus.has(comb) ? menus.get(comb) + 1 : 1);
});
});
let populate = Math.max(...menus.values());
menus.forEach((count, menu, map) => {
if(count === populate && count >= 2) answer.push(menu);
});
});
return answer.sort();
}
function getCombination(arr, num){
const results = [];
if(num === 1) return arr.map(v => [v]);
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combinations = getCombination(rest, num - 1);
const attached = combinations.map(v => [fixed, ...v]);
results.push(...attached);
});
return results;
}
▷ 복기 :
오랜만에 내가 생각한 그래도 막힘없이 풀었던 문제였다.
마지막에 "배열의 각 원소에 저장된 문자열 또한 알파벳 오름차순으로 정렬한다."라는 점을 놓쳐서 좀 지체됐지만 다행히 문제에서 내가 놓친 부분을 빠르게 캐치할 수 있어서 다시 구현하는 불상사는 일어나지 않았다.
구현은 생각한 대로 됐지만 아무래도 성능상 그렇게 좋지 못한 코드가 탄생했다.
현재 내 실력으로는 이게 한계인데, 다른 사람들이 어떻게 풀었는지 좀 탐구를 해봐야겠다.
댓글