functionnewChickenRecipe(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 함수를 호출하여 가능한 모든 조합을 찾음returnrecur(freshArr, choiceNum);
}
forEach 구문은 배열 arr을 반복하면서 다음 작업을 수행합니다:
현재 요소를 hand 변수에 저장합니다.
현재 요소를 제외한 나머지 요소로 새 배열 restArr를 만듭니다.
recur 함수를 재귀적으로 호출하여 새 배열 restArr에서 (choiceNum - 1)개의 요소를 선택한 모든 가능한 조합을 찾습니다.
permuationArr의 각 조합 앞에 fixer 요소를 추가하여 새로운 배열 combineFixer를 만듭니다.
combineFixer 배열을 result 배열에 추가합니다.
이러한 방식으로, recur 함수는 입력 배열에서 choiceNum 개의 요소로 가능한 모든 조합을 찾게 됩니다.
레퍼런스 코드
functionnewChickenRecipe(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를 상대로 순열 구하기constpermutation = (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;
}