순열 코드
// [10000, 10, 1], 3
function permutation(arr, selectNum) {
let result = [];
if (selectNum === 1) return arr.map((v) => [v]);
arr.forEach((v, idx, arr) => {
const fixer = v;
// > Array [10, 1]
// > Array [1]
// > Array [10]
// > Array [10000, 1]
// > Array [1]
// > Array [10000]
// > Array [10000, 10]
// > Array [10]
// > Array [10000]
const restArr = arr.filter((_, index) => index !== idx);
// > Array [Array [1]]
// > Array [Array [10]]
// > Array [Array [10, 1], Array [1, 10]]
// > Array [Array [1]]
// > Array [Array [10000]]
// > Array [Array [10000, 1], Array [1, 10000]]
// > Array [Array [10]]
// > Array [Array [10000]]
// > Array [Array [10000, 10], Array [10, 10000]]
const permuationArr = permutation(restArr, selectNum - 1);
// > Array [Array [10, 1]]
// > Array [Array [1, 10]]
// > Array [Array [10000, 10, 1], Array [10000, 1, 10]]
// > Array [Array [10000, 1]]
// > Array [Array [1, 10000]]
// > Array [Array [10, 10000, 1], Array [10, 1, 10000]]
// > Array [Array [10000, 10]]
// > Array [Array [10, 10000]]
// > Array [Array [1, 10000, 10], Array [1, 10, 10000]]
const combineFixer = permuationArr.map((v) => [fixer, ...v]); result.push(...combineFixer);
});
return result;
}
중복순열 코드
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;
}
조합 코드
function combination(arr, selectNum) {
const result = [];
// num이 1일때는 각 요소를 이중 배열로 만듬
// [1, 10, 1100, 1111] => [[1],[10],[1100],[1111]]
if (selectNum === 1) return arr.map((v) => [v]);
arr.forEach((v, idx, arr) => {
// v = 현재 값
const fixed = v;
// 인덱스를 제외한 값을 배열로 만든다.
// > Array [10, 1100, 1111]
// > Array [1, 1100, 1111]
// > Array [1, 10, 1111]
// > Array [1, 10, 1100]
const restArr = arr.filter((_, index) => index !== idx);
// > Array [Array [10], Array [1100], Array [1111]] => [[10],[1100],[1111]]
// > Array [Array [1], Array [1100], Array [1111]]
// > Array [Array [1], Array [10], Array [1111]]
// > Array [Array [1], Array [10], Array [1100]]
const combinationArr = combination(restArr, selectNum - 1);
// > Array [Array [1, 10], Array [1, 1100], Array [1, 1111]] => [[1,10],[1,1100],[1,1111]]
// > Array [Array [10, 1], Array [10, 1100], Array [10, 1111]]
// > Array [Array [1100, 1], Array [1100, 10], Array [1100, 1111]]
// > Array [Array [1111, 1], Array [1111, 10], Array [1111, 1100]]
const combineFix = combinationArr.map((v) => [fixed, ...v]);
result.push(...combineFix);
});
return result;
}