[프로그래머스] 레벨3 (level3) 메뉴 리뉴얼

2021년 03월 13일, 19:30

메뉴 리뉴얼

문제풀이

  1. 손님이 주문한 메뉴들에 대해서 course를 기준으로 순열을 돌린다.
  2. obj에 해당 메뉴들이 몇번 주문됐는지 계산한다.
  3. obj에서 최댓값을 뽑아서 메뉴를 구성한다.
function permutation(arr, pick, str){
    if(str.length === pick) return [];
    return arr.reduce((acc,val,i) => {
        let newArr = arr.slice(i+1);
        let result = permutation(newArr, pick, str+val);
        let w = str+val;
        if(w.length === pick){
            acc.push(w);
        }
        acc.push(...result);
        return acc;
    },[]);
}

function solution(orders, course) {
    const answer = [];
    const obj = {};
    for(const c of course){ // 코스요리로 만들 음식 갯수를 가지는 배열
        orders.map(order => {
            const r = permutation([...order].sort(), c, "");
            r.map(e => {
                obj[e] ? obj[e]++ : obj[e] = 1; // 음식들의 조합이 몇번 나왔는지 누적
            })
        });        
    }
    
    const result = Object.entries(obj).filter(([k,v]) => v >= 2); // 2 이상이여야 하므로 2이상만 필터링
    for(const c of course){ // 각 코스요리를 뽑아야 함
        const temp = result.filter(e => e[0].length === c).sort((a,b) => b[1]-a[1]);
        for(let i=0 ; i<temp.length ; i++){
            if(temp[i+1] && temp[i][1] !== temp[i+1][1]){ // 최댓값이 하나인경우
                answer.push(...temp.slice(0, i+1).map(e => e[0]));
                break;
            }
            if(i === temp.length-1){ // 최댓값이 여러 개인 경우
                answer.push(...temp.map(e => e[0]));
            }
        }
    }   
    return answer.sort();
}