순열: 순서가 상관있다. / 5개중 2개뽑기 5x4 (1,4과 4,1이 다름)
조합: 순서가 상관없다. / 5개중 2개뽑기 5x4/2
1.for문 중첩
//[i,j,k]를 만들때
for(let i=0; i<arr.length; i++){
for(let j=0; j<arr.length; j++){
for(let k=0; k<arr.length; k++) {
// 중복 배제
if( i === j || j === k || k === i ) continue;
const current = [ arr[i], arr[j], arr[k] ];
ans.push(current);
}
}
}
2.재귀함수
const result=[]
const
let permutate = function (roundsToGo, playedSoFar) {
// rounds가 0일 재귀에서 빠져나옵니다.
if (roundsToGo === 0) {
result.push(playedSoFar);
return;
}
// rps 배열을 한 번씩 순회합니다.
for (let i = 0; i < rps.length; i++) {
// rps의 i번째 요소를 변수에 담아서
let currentPlay = rps[i];
// permutate(본인)에 기존 rounds에서 하나 뺀 숫자와, 일회용 배열 playedSoFar에 currentPlay를 삽입하여 재귀를 실행합니다.
// rounds에서 하나를 빼는 이유는, 일회용 배열의 크기를 rounds만큼 맞춰주기 위함입니다. [rock, rock, rock]
permutate(roundsToGo - 1, playedSoFar.concat(currentPlay));
}
};
3.함수
const getCombinations = function (arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((value) => [value]); // 1개씩 택할 때, 바로 모든 배열의 원소 return
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1); // 해당하는 fixed를 제외한 나머지 뒤
const combinations = getCombinations(rest, selectNumber - 1); // 나머지에 대해서 조합을 구한다.
const attached = combinations.map((combination) => [fixed, ...combination]); // 돌아온 조합에 떼 놓은(fixed) 값 붙이기
results.push(...attached); // 배열 spread syntax 로 모두다 push
});
return results; // 결과 담긴 results return
}
const getPermutations= function (arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((value) => [value]); // 1개씩 택할 때, 바로 모든 배열의 원소 return
arr.forEach((fixed, index, origin) => {
const rest = [...origin.slice(0, index), ...origin.slice(index+1)] // 해당하는 fixed를 제외한 나머지 배열
const permutations = getPermutations(rest, selectNumber - 1); // 나머지에 대해 순열을 구한다.
const attached = permutations.map((permutation) => [fixed, ...permutation]); // 돌아온 순열에 대해 떼 놓은(fixed) 값 붙이기
results.push(...attached); // 배열 spread syntax 로 모두다 push
});
return results; // 결과 담긴 results return
}
function permutation(arr, selectNum) {
const result = [];
if (selectNum === 1) return arr.map((v) => [v]);
arr.forEach((v, idx, arr) => {
const fixed = v;
const restArr = arr;
const permutationArr = permutation(restArr, selectNum - 1);
const combineFix = permutationArr.map((v) => [fixed, ...v]);
result.push(...combineFix);
});
return result;
}