[Algorithm] 반찬의 모든 경우의 수 (멱집합)

Yalstrax·2021년 7월 25일
2

Algorithm

목록 보기
1/17

밥과 먹을 수 있는 모든 반찬의 경우 (멱집합)

문제

밥은 한 가지이며 반찬은 다수일 때, 밥과 함께 먹을 수 있는 반찬의 모든 경우의 수를 배열에 담아 리턴하세요.

입력

인자 1: sideDishes

  • String 타입의 영문으로 된 반찬이 나열되어 있는 배열

출력

  • Array 타입을 리턴해야 합니다.
  • 밥과 함께 먹을 수 있는 반찬의 모든 경우의 수가 담긴 배열

주의사항

  • 반찬은 영문으로 작성이 되어 있습니다.
  • 반찬은 중복되지 않습니다.
  • 반찬을 먹지 않는 것도 포함됩니다. (출력되는 2차원 배열은 빈 배열을 포함합니다.)
  • 반찬은 3개 이상 99개 이하입니다.
  • 출력되는 배열은 전부 사전식 순서(lexical order)로 정렬되어야 합니다.

입출력 예시

나의 코드

멱집합은 조합과 유사합니다.
멱집합이 주어진 배열에서 나올 수 있는 모든 경우의 수라고 한다면,

조합으로 표현하면 주어진 배열에서 0개를 뽑는 경우 부터 배열의 길이까지 뽑는 경우를 더한 결과는 멱집합의 결과와 같습니다.

그러나, 멱집합을 쉽게 표현하기 위해 이중 반복문을 사용할 수 있습니다.

결과

소스코드

function houseMeal(sideDishes) {
  // 입력받은 배열을 사전식 순서로 정렬합니다.
  sideDishes.sort();
  // 가능한 모든 부분 집합에는 빈 배열도 포함됩니다.
  let result = [[]];
  // 배열을 반복 순회합니다.
  for (let i = 0; i < sideDishes.length; i++) {
    // 최종적으로 리턴할 배열의 길이 변수를 선언합니다.
    let len = result.length;
    // 이 배열의 길이만큼 반복 순회합니다.
    // 입력받은 배열이 ["spam", "pizza", "kimchi"]라면,
    // 최초로 spam일 때 이중 반복문은 아래와 같이 수행됩니다.
    // result 배열은 빈 배열만 담겨있으므로 len은 1입니다.
    // 그렇다면, j는 0일 때 반복만 수행하게 됩니다.
    for (let j = 0; j < len; j++) {
      // result 배열에 result의 0번째 인덱스(빈 배열)과
      // spam을 합친 배열을 push합니다.
      result.push([...result[j], sideDishes[i]]);
    }
    // 반복문을 나와서, pizza일 때 반복을 수행합니다.
    // result의 요소는 [ 빈 배열, spam ] 입니다.
    // len은 2가 되며, 순회하는 j는 0과 1입니다.
    // result 배열에 push되는 값은
    // result의 0번째 인덱스인 빈 배열과 pizza를 합친 배열과
    // result의 1번째 인덱스인 spam과 pizza를 합친 배열입니다.
    // 즉, result에 담긴 요소는 반복 수행 순서대로
    // [ [], [spam], [pizza], [spam, pizza] ]가 됩니다.
    // 위 같은 로직으로 반복이 수행됩니다.
  }
  return result.sort();
}

let sideDishes = ["spam", "pizza", "kimchi"];
console.log(houseMeal(sideDishes));
profile
즐겁다면 그것만으로 만만세!

0개의 댓글