밥은 한 가지이며 반찬은 다수일 때, 밥과 함께 먹을 수 있는 반찬의 모든 경우의 수를 배열에 담아 리턴하세요.
멱집합은 조합과 유사합니다.
멱집합이 주어진 배열에서 나올 수 있는 모든 경우의 수라고 한다면,
조합으로 표현하면 주어진 배열에서 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));