[JavaScript] 프로그래머스 메뉴 리뉴얼 LEVEL2

김예진·2021년 2월 14일
0

코딩 테스트

목록 보기
39/42

문제 출처

const getCombinations = (arr, selectNumber) => {
    const results = [];
    if (selectNumber === 1) return arr.map((value) => [value]);

    arr.forEach((fixed, index, origin) => {
        const rest = origin.slice(index + 1);
        const combinations = getCombinations(rest, selectNumber - 1);
        const attached = combinations.map((combination) => [fixed, ...combination]);
        results.push(...attached);
    });

    return results;
}

function solution(orders, course) {
    const answer = [];
    const obj = {};
    
    for (const order of orders) {
        const orderArr = order.split('');
        let combiArr = [];
        
        for (const c of course) {
            if (order.length < c) break;
            const combi = getCombinations(orderArr, c);
            combiArr = combiArr.concat(combi);
        }
        
        for (const combi of combiArr) {
            const str = combi.sort().join('');
            obj[str] ? obj[str] += 1 : obj[str] = 1;
        }
    }
    
    for (const c of course) {
        const filteredArr = Object.entries(obj).filter(o => o[0].length === c && o[1] > 1);
        const max = Math.max(...filteredArr.map(f => f[1]));
        
        filteredArr.forEach(f => {
            if (f[1] === max) answer.push(f[0]);
        });
    }
    
    return answer.sort();
}

풀이

뽀인트는 각 order에 대해 조합을 만드는 것이다!
가능한 모든 조합을 만들었다면, 그 조합의 개수를 새는 것이다.
주의할 점은 조합을 알파벳 순서로 정렬해줘야 'XW'랑 'WX'랑 같은 걸로 칠 수 있다.

각 조합별로 갯수를 셌다면, 최종적으로 course랑 문자열의 길이가 같은 조합 중 갯수가 가장 많은 조합을 answer에 추가해주면 된다.

참고 - 카카오 풀이
참고 - 블로그 풀이

0개의 댓글