본문 바로가기
Algorithm/문제풀이

[프로그래머스] 메뉴 리뉴얼(LV.2) by javascript - 2021 KAKAO BLIND RECRUITMENT

by 썸머워즈 2022. 3. 14.
반응형

▷ 문제 : 2021 KAKAO BLIND RECRUITMENT - 메뉴 리뉴얼 LV.2

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

해결 날짜 : 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;
}


복기 :
오랜만에 내가 생각한 그래도 막힘없이 풀었던 문제였다.
마지막에 "배열의 각 원소에 저장된 문자열 또한 알파벳 오름차순으로 정렬한다."라는 점을 놓쳐서 좀 지체됐지만 다행히 문제에서 내가 놓친 부분을 빠르게 캐치할 수 있어서 다시 구현하는 불상사는 일어나지 않았다.

구현은 생각한 대로 됐지만 아무래도 성능상 그렇게 좋지 못한 코드가 탄생했다.
현재 내 실력으로는 이게 한계인데, 다른 사람들이 어떻게 풀었는지 좀 탐구를 해봐야겠다.

반응형


댓글

TOP