function newChickenRecipe(stuffArr, choiceNum) {
// 000으로 끝나는 재료를 걸러냄
let freshArr = stuffArr.filter((el) => String(el).slice(-3) !== "000");
// 가능한 모든 조합을 찾는 재귀 함수를 정의함
const recur = function (arr, choiceNum) {
let result = [];
// 기저 조건: choiceNum이 1인 경우, 각 요소를 1D 배열로 변환하여 리턴함
if (choiceNum === 1) return arr.map((hand) => [hand]);
// 재귀적인 경우: 배열의 각 요소에 대해 반복함
arr.forEach((hand, idx, arr) => {
const fixer = hand; // 현재 요소를 "fixer"로 저장함
const restArr = arr.filter((_, index) => index !== idx); // 현재 요소를 제외한 새로운 배열을 만듦
const permuationArr = recur(restArr, choiceNum - 1); // 새로운 배열에서 (choiceNum - 1) 요소로 가능한 모든 조합을 재귀적으로 찾음
const combineFixer = permuationArr.map((hand) => [fixer, ...hand]); // permuationArr의 각 조합에 "fixer"를 앞에 추가함
result.push(...combineFixer); // 결과 조합을 "result" 배열에 추가함
});
return result;
};
// recur 함수를 호출하여 가능한 모든 조합을 찾음
return recur(freshArr, choiceNum);
}
forEach 구문은 배열 arr을 반복하면서 다음 작업을 수행합니다:
현재 요소를 hand 변수에 저장합니다.
현재 요소를 제외한 나머지 요소로 새 배열 restArr를 만듭니다.
recur 함수를 재귀적으로 호출하여 새 배열 restArr에서 (choiceNum - 1)개의 요소를 선택한 모든 가능한 조합을 찾습니다.
permuationArr의 각 조합 앞에 fixer 요소를 추가하여 새로운 배열 combineFixer를 만듭니다.
combineFixer 배열을 result 배열에 추가합니다.
이러한 방식으로, recur 함수는 입력 배열에서 choiceNum 개의 요소로 가능한 모든 조합을 찾게 됩니다.
레퍼런스 코드
function newChickenRecipe(stuffArr, choiceNum) {
// stuffArr에서 0이 3개 이상이라면 전부 필터로 거르기.
let freshArr = [];
for (let i = 0; i < stuffArr.length; i++) {
const element = String(stuffArr[i])
.split('')
.filter((e) => e === '0');
if (element.length <= 2) {
freshArr.push(stuffArr[i]);
}
}
// 정렬
freshArr.sort((a, b) => a - b);
// 엣지 케이스 처리
if (freshArr.length === 0 || freshArr.length < choiceNum) return [];
// 레시피 초기화
let result = [];
// freshArr를 상대로 순열 구하기
const permutation = (arr, bucket, n) => {
if (n === 0) {
result.push(bucket);
return;
}
for (let i = 0; i < arr.length; i++) {
// 하나를 초이스함
const choice = arr[i];
// 배열을 슬라이스함
const sliceArr = arr.slice();
// 초이스만 뺀다
sliceArr.splice(i, 1);
// 재귀
permutation(sliceArr, bucket.concat(choice), n - 1);
}
};
// 실행
permutation(freshArr, [], choiceNum);
// 순열의 길이 반환
return result;
}