순열같은경우 중복이 되면 안되기 떄문에
중복순열과 비슷한 알고리즘이지만
얕은카피를 해와서 기준이 되는 요소를 스플라이슬를해줘서 다시 중복이 되지않게 해주는 방향으로 알고리즘을 짠다
N 가지의 재료 중에 단 M 가지만을 사용하여 조합한 모든 경우의 수 중 하나이다.
재료는 0과 1로만 이루어진 숫자로 암호화가 되어 있고, 항상 1로 시작하며 복호화를 할 수 없다.
단, 0이 3개 이상인 재료는 상한 재료이기 때문에 제외한다.
재료의 순서에 따라 맛이 달라지기 때문에, 재료를 넣는 순서가 다르다면 다른 레시피이다.
이 소문을 참고하여 '비밀의 승승장구 치킨 소스'가 될 수 있는 경우의 수를 모두 반환하는 함수를 작성하세요.
입출력 예시
const output1 = newChickenRecipe([1, 10, 1100, 1111], 2);
console.log(output1);
/*
[
[1, 10], [1, 1100], [1, 1111],
[10, 1], [10, 1100], [10, 1111],
[1100, 1], [1100, 10], [1100, 1111],
[1111, 1], [1111, 10], [1111, 1100]
];
*/
const output2 = newChickenRecipe([10000, 10, 1], 3);
console.log(output2); // []
const output3 = newChickenRecipe([11, 1, 10, 1111111111, 10000], 4);
console.log(output3);
/*
[
[1, 10, 11, 1111111111],
[1, 10, 1111111111, 11],
[1, 11, 10, 1111111111],
[1, 11, 1111111111, 10],
[1, 1111111111, 10, 11],
[1, 1111111111, 11, 10],
[10, 1, 11, 1111111111],
[10, 1, 1111111111, 11],
[10, 11, 1, 1111111111],
[10, 11, 1111111111, 1],
[10, 1111111111, 1, 11],
[10, 1111111111, 11, 1],
[11, 1, 10, 1111111111],
[11, 1, 1111111111, 10],
[11, 10, 1, 1111111111],
[11, 10, 1111111111, 1],
[11, 1111111111, 1, 10],
[11, 1111111111, 10, 1],
[1111111111, 1, 10, 11],
[1111111111, 1, 11, 10],
[1111111111, 10, 1, 11],
[1111111111, 10, 11, 1],
[1111111111, 11, 1, 10],
[1111111111, 11, 10, 1],
]
*/
function newChickenRecipo(stuffArr, choiceNum){
let fresh = []
for(let n = 0 ; n<stuffArr.length ; n++){
const element = String(stuffArr[n]
.split("")
.filter((el)=> el === "0")
if(element.length<3){
fresh.push(stuffArr[n]
}
}
fresh.sort((a,b)=>a-b)
const newRecipe = []
const aux = (arr,bucket,num)=>{
if(num === 0){
newRecipe.push(bucket)
return
}
for(let n= 0 ; n<arr.length ; n++){
const pick = arr[n]
const shallowCopy = arr.slice()
shallowCopy.splice(n,1)
aux(shallowCopy,bucket.concat(pick),num-1)
}
}
aux(fresh,[],choiceNum)
return newRecipe
}