- 문제
- 유명한 치킨집의 레시피 일부를 구하여, 그것을 바탕으로 치킨 소스 레시피를 개발
- 주어진 재료는 1로 시작하고 0과 1로만 이루어진 암호코드로 되어 있음
- 0이 3개 이상인 재료는 상한 재료이므로 제외하여아 한다
- 재료가 부족하여 레시피를 만들 수 없는 경우에는 빈 배열을 리턴
- 주어진 재료 N개 중 M개만을 사용하여 조합하는 모든 경우의 수를 리턴
- 시도
- 주어진 재료 중 상한 재료를 제외하고 신선한 재료 배열을 만든다
- 신선한 재료 배열이 골라야 할 재료의 개수보다 작으면 레시피를 만들수 없으므로 빈 배열 리턴
- 생각보다 어려워 레퍼런스를 보고 풀었다
- 수도코드
function newChickenRecipe(stuffArr, choiceNum) {
let freshStuff = [];
for (let i = 0; i < stuffArr.length; i++) {
let str = String(stuffArr[i])
.split('')
.filter(e => e === '0');
if (str.length < 3) {
freshStuff.push(stuffArr[i]);
}
}
if (freshStuff.length < choiceNum) {return [];}
freshStuff.sort((a,b) => a - b);
let recipe = [];
const maker = (arr, cur, num) => {
if (num === 0) {
recipe.push(cur);
return;
}
for (let i = 0; i < arr.length; i++) {
const now = arr[i];
const sliceArr = arr.slice();
sliceArr.splice(i,1);
maker(sliceArr, cur.concat(now), num - 1);
}
}
maker(freshStuff, [], choiceNum);
return recipe;
}
- 레퍼런스
function newChickenRecipe(stuffArr, choiceNum) {
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 = [];
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;
}