[2021 Kakao Blind Recruitment] 메뉴 리뉴얼

김아현·2023년 7월 24일
0

코딩테스트

목록 보기
25/26
post-thumbnail

문제 접근

  • 각 손님 별 단품 메뉴를 딕셔너리에 넣고, 2개 이상의 원소에 대한 조합을 짠 다음 호출 횟수를 기록한다
  • 코스의 요리 개수는 단품 메뉴를 가장 많이 주문한 조합 이하이다
  • 조합을 찾기 쉽도록 문자열 오름차순으로 orders배열을 정렬한다

1트 코드

function solution(orders, course) {
    let answer = [];
    const d = {};
    let maxNum = {};
    
    const getCombinations = (arr, num) => {
        const results = []
        if (num === 1) return arr.map((el) => el);
        arr.forEach((fixed, idx, origin) => {
            const rest = origin.slice(idx + 1);
            const comb = getCombinations(rest, num - 1);
            const attached = comb.map((c) => [fixed, ...c].sort().join(''));
            results.push(...attached)
        })
        return results
    } 


    orders.forEach((order) => {
        const menu = order.split('').sort()
        course.forEach((num) => { 
            maxNum[num] = 0;
            getCombinations(menu, num).forEach((item) => {
                if (!d[item]) d[item] = 1;
                else d[item]++; // 조합 등장횟수
            })
        })
    });
    
    for (const item in d) {
        const len = item.length;
        if (d[item] > maxNum[len]) {
            maxNum[len] = d[item];
        }
    }

    for (const item in d) {
        const len = item.length;
        if (d[item] === maxNum[len] && maxNum[len] > 1 ) {
            answer.push(item);
        }
    } 

    return answer.sort();
}

참고

조합과 순열 js자료
자바스크립트는 조합, 순열 연산을 위한 라이브러리가 따로 없다. 따라서 참고 자료를 이용해 코드를 작성해야 한다.

profile
멘티를 넘어 멘토가 되는 그날까지 파이팅

0개의 댓글