[프로그래머스] 코딩테스트 연습 - 32

krkorklo·2022년 2월 4일
0

프로그래머스

목록 보기
32/78

level 2 - 메뉴 리뉴얼

각 손님들이 주문한 단품메뉴들이 문자열 형식으로 담긴 배열 orders, "스카피"가 추가하고 싶어하는 코스요리를 구성하는 단품메뉴들의 갯수가 담긴 배열 course가 매개변수로 주어질 때, "스카피"가 새로 추가하게 될 코스요리의 메뉴 구성을 문자열 형태로 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

입출력 예시
orders : ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
course : [2,3,4]
-> ["AC", "ACDE", "BCFG", "CDE"]

function solution(orders, course) {
    var answer = [];
    var count = {};
    
    course.forEach((c) => {
        count = {};
        orders.forEach((o) => {
            o = o.split('').sort().join('');
            dfs(o, 0, c, "");
        })
        var max = 1;
        for (var c in count) {
            if (count[c] == 1) delete count[c];
            else if (max < count[c]) max = count[c];
        }
        for (var c in count) {
            if (max == count[c]) answer.push(c);
        }
    })
  
    function dfs(order, cur_idx, size, course) {
        if (cur_idx == order.length) {
            if (size == course.length) {
                if (course in count) count[course]++;
                else count[course] = 1;
            }
            return;
        }
        dfs(order, cur_idx + 1, size, course + order.slice(cur_idx, cur_idx + 1));
        dfs(order, cur_idx + 1, size, course);
    }
    
    return answer.sort();
}

통과하긴 했는데 중복되는 작업이 많은 것 같아서 코드를 조금 고쳐봤다.

function solution(orders, course) {
    var answer = [];
    var count = {};

    orders.forEach((o) => {
        o = o.split('').sort().join('');
        dfs(o, 0, "");
    })
    function dfs(order, cur_idx, chose) {
        if (cur_idx == order.length) {
            if (course.includes(chose.length)) {
                if (chose in count) count[chose]++;
                else count[chose] = 1;
            }
            return;
        }
        dfs(order, cur_idx + 1, chose + order.slice(cur_idx, cur_idx + 1));
        dfs(order, cur_idx + 1, chose);
    }
    
    var max = [];
    for (var cnt in count) {
        if (count[cnt] == 1) continue;
        if (!max[cnt.length] || max[cnt.length] < count[cnt]) max[cnt.length] = count[cnt];
    }
    for (var cnt in count) {
        if (max[cnt.length] == count[cnt]) answer.push(cnt);
    }
    
    return answer.sort();
}

0개의 댓글