[프로그래머스] 메뉴 리뉴얼 (JS)

hhkim·2023년 10월 16일
0

Algorithm - JavaScript

목록 보기
159/188
post-thumbnail

풀이 과정

  1. 각 주문에 대해 반복
  2. 각 주문을 오름차순으로 정렬하고 재귀 실행
  3. 재귀 함수는 전달받은 문자열에 다음 주문을 붙여서 문자열을 만들어 조합
  4. 더이상 붙일 문자열이 없으면(만들려고 한 길이가 됐으면) 주문된 횟수 추가
    주문이 2번 이상 됐으면 결과 객체에 추가
    각 주문에 대해 최대 주문 수 갱신
  5. 결과 객체의 값이 최대 주문 수와 같은 것만 남기고 오름차순 정렬

코드

function solution(orders, course) {
  const ordered = {};
  const result = {};
  const countMax = Array(10 + 1).fill(0);

  const recursion = (arr, start, len, str) => {
    if (len === 0) {
      ordered[str] = (ordered[str] || 0) + 1;
      if (ordered[str] > 1) result[str] = ordered[str];
      countMax[str.length] = Math.max(countMax[str.length], ordered[str]);
      return;
    }

    for (let i = start; i < arr.length; ++i) {
      recursion(arr, i + 1, len - 1, str + arr[i]);
    }
  };

  orders.forEach((order) => {
    const sorted = order.split('').sort();
    course.forEach((len) => {
      recursion(sorted, 0, len, '');
    });
  });

  return Object.keys(result)
    .filter((e) => countMax[e.length] === result[e])
    .sort();
}

🤔

도저히 어떻게 풀지 감이 안 잡혀서 다른 사람의 풀이를 참고했다.
면접 준비가 더 급하기 때문에 이해하고 넘어가는 정도로만 했다.
핵심은 '조합'이고, 보통 재귀 함수로 구현을 한다.

0개의 댓글