프로그래머스 메뉴 리뉴얼 JavaScript
2023년 5월 15일
문제 풀이
단품메뉴들이 담긴 문자열 형식의 배열 orders
를 코스요리를 구성하는 단품메뉴들의 개수가 담긴 배열 course
의 값만큼 단품메뉴를 고르는 문제. 이때 코스요리는 최소 2가지 이상의 단품 메뉴로 구성되고, 각 손님들이 주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성하고, 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 고른다.
course
를 순회하면서 그 값만큼 모든 orders
를 조합하여 나온 메뉴 중 최댓값들을 선택한다.
function combination(arr, r)
: 단품메뉴들이 담긴 배열 arr
, 서로 다른 arr
중 r 개를 선택하기 위한 r
를 매개변수로 받고, 이것을 이용해 r 개를 선택한 조합들의 배열을 반환한다.
function getCourseMenu(obj)
: 코스요리메뉴: 주문수 형태의 객체 obj
를 매개변수로 받아 가장 많이 주문한 코스요리 메뉴들을 담은 배열을 반환한다.
solution.js
function solution(orders, course) {
let answer = [];
course.forEach(n => {
const menu = {};
orders.forEach(order => {
const order_combi = combination([...order], n);
order_combi.forEach(item => {
const item_str = item.sort().join('');
menu[item_str] = menu[item_str] ? menu[item_str] + 1 : 1;
})
});
const courseMenu = getCourseMenu(menu);
answer = [...answer, ...courseMenu];
});
return answer.sort();
}
function combination(arr, r) {
const result = [];
if (r === 1) {
return arr.map(el => [el]);
}
arr.forEach((item, index, origin) => {
const rest = origin.slice(index + 1);
const combi = combination(rest, r - 1);
const attached = combi.map(el => [item, ...el]);
result.push(...attached);
});
return result;
}
function getCourseMenu(obj) {
let result = [];
let max = 2;
Object.keys(obj).forEach(item => {
const cnt = obj[item];
if (max < cnt) {
max = cnt;
result = [item];
}
else if (max === cnt) {
result.push(item);
}
});
return result;
}