본문 바로가기
개발/알고리즘

[2021 카카오 신입 공채][Javascript] 메뉴 리뉴얼

by JeonJaewon 2021. 4. 25.

 완전 제 멋대로 풀어봤습니다.

 

 문제에 워낙 조건과 요구사항이 많지만... 제 생각에 문제 풀이에 중요한 조건은 다음과 같습니다.

  •  코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성
  •  최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함 

 즉, 간단하게 말하면 'AB'처럼 문자열 길이가 2 이상이고, 'AB'가 주문된 횟수가 2 이상일 때만 포함시키면 되겠습니다.

 

 코스 요리 조합이 나올 수 있는 경우의 수를 combination을 통해서 다 찾았습니다. 그리고 Map에 key로 메뉴의 조합을, value로 주문 횟수를 넣어 저장합니다.

 이차원 배열 courseArr을 만들어 courseArr[n][0]에는 메뉴 조합을, courseArr[n][1]에는 주문 횟수를 저장합니다. 이 배열을 통해서 가장 주문 횟수가 많은 메뉴를 찾아줍니다.

 

 발상은 알겠는데 구현이 꽤 오래 걸렸습니다. 더 효율적인 방법이 있을 것 같기도 하네요

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const final = [];
const map = new Map();
 
function combination(source, target, n, r, count) {
    if (r === 0) {
        const key = target.sort().join('');
        const val = map.get(key) || 0;
        map.set(key, val+1);
    }
        
    else if (n === 0 || n < r) {
        return;
    }
    else {
        target.push(source[count]);
        combination(source, [].concat(target), n - 1, r - 1, count + 1);
        target.pop();
        combination(source, [].concat(target), n - 1, r, count + 1); 
    } 
}
 
function solution(orders, course) {
    var courseArr = Array.from(Array(11), () => Array(2).fill(0))
    var answer = [];
    for (const order of orders) {
        for (let i = 2; i <= order.length; i++) {
            combination(order, [], order.length, i, 0);    
        }
    }
 
    for(let [key, value] of map) {
        if (value > 1 && course.includes(key.length)) {
            const cnt = courseArr[key.length][1];
            if (!cnt) {
                courseArr[key.length][0= [key];
                courseArr[key.length][1= value;
                continue;
            }
            if (courseArr[key.length][1< value) {
                courseArr[key.length][0= [key];
                courseArr[key.length][1= value;
            } else if (cnt == value) {
                courseArr[key.length][0].push(key);
            }
        }
    }
    for (let i = 0; i < courseArr.length; i++) {
        if (courseArr[i][0].length >= 1) {
            answer.push(...courseArr[i][0]);
        }
    }
    answer.sort();
    return answer;
}
cs

 

댓글