[JavaScript][Programmers] 메뉴의 리뉴얼

조준형·2021년 9월 1일
0

Algorithm

목록 보기
101/142
post-thumbnail

🔎 메뉴의 리뉴얼

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/72411

📄 제출 코드

function solution(orders, course) {
  let answer = [];
  
  for (let c = 0; c < course.length; c++) {
    answers.splice(0);

    // 사용한 알파벳 담기
    orders.forEach(el => {
      let Alpha = []
      Alpha.push(...el.split(''));
      dfs(Alpha, course[c], 0)
    })

    // check 만들기
    let check = new Set
    answers.forEach(el => {
      check[el.sort().join('')] = 0;
    })

    let keys = Object.keys(check);
    for (let i = 0; i < keys.length; i++) {
      for (let j = 0; j < orders.length; j++) {
        for (let k = 0; k < keys[i].length; k++) {
          if (orders[j].indexOf(keys[i][k]) == -1) break;
          if (k == keys[i].length - 1 && orders[j].indexOf(keys[i][k])!=-1) {
            check[keys[i]]++;
          }
        } // k
      } // j
    } // i

    let max = Math.max(...Object.values(check))

    keys.forEach((el) => {
      if (max >= 2 && check[el] == max) answer.push(el);
    })
  } // c
  return answer.sort();
}

let answers = [];
function dfs(Alpha, num, depth, arr = []) {
  if (num == depth) answers.push([...arr])
  else {
    for (let i = 0; i < Alpha.length; i++){
      if (arr.indexOf(Alpha[i]) == -1) {
        arr.push(Alpha[i]);
        dfs(Alpha.slice(i), num, depth + 1, arr);
        arr.pop();
      }
    }
  }
}
let orders =	["XYZ", "XWY", "WXA"];
let course = [2, 3, 4];
console.log(solution(orders, course));

그냥 생각나는대로 조합으로 풀었는데 4중 포문쓰면서 이게맞나,, 하면서 풀었는데 의외로 풀려서 좋았다.

처음 실패가 떴을 때는 max가 2보다 더큰 경우를 생각하지않아서 오답이 나왔다.
문제에 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다.라고 나와있기 때문에 max>=2일때 answer에 push해야한다.

두 번째 풀 때는 orders에 있는 알파벳 종류들을 다모아서 모든 조합을 찾았는데 채점시 13,14,15 런타임 에러가 났다.
그래서 질문게시판을 찾아보니까 조합의 경우의 수를 줄이면 해결된다고 나와있었다.

'ABC' / 'DEF' / 'GHI'
세 문자열을 합쳐서 'ABCDEFGHI'로 만드는 조합 개수보다
ABC조합 + DEF조합 + GHI조합의 수가 훨씬 적어 시간초과에 걸리지 않는다고 한다.

두가지를 고치니 정답이 나왔다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글