프로그래머스 메뉴 리뉴얼 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;
}

댓글