중복순열(permutation with repetition)
- 중복 O, 순서 O
- 중복을 허용하는 순열 (조합과 다르게 순서가 있음)
: 3개 중 3개로 요소의 중복을 허용하고 순서를 부여하여 조합할 수 있는 모든 경우의 수
function forloop(){
let result = [];
let lookup = [1, 2, 3];
for(let i = 0; i < 3; i++){
let pick1 = lookup[i];
for(let j = 0; j < 3; j++){
let pick2 = lookup[j];
for(let k = 0; k < 3; k++){
let pick3 = lookup[k];
result.push([pick1, pick2, pick3]);
}
}
}
return result;
}
function forloop(){
let result = [];
let lookup = [1, 2, 3];
for(let i = 0; i < 3; i++){
for(let j = 0; j < 3; j++){
for(let k = 0; k < 3; k++){
result.push([lookup[i], lookup[j], lookup[k]]);
}
}
}
return result;
}
let result = [];
let lookup = [1, 2, 3];
function recursion(count, bucket){
if(count === 0){
result.push(bucket);
return;
}
for(let i = 0; i < 3; i++){
const pick = lookup[i];
recursion(count - 1, bucket.concat(pick));
}
}
recursion(3, []);
순열(permutation)
- 중복 X, 순서 O
- 중복없는 순서있는 배열
: 3개 중 3개로 요소의 중복없이 순서를 부여하여 조합할 수 있는 모든 경우의 수
function forloop(){
let result = [];
let lookup = [1, 2, 3];
for(let i = 0; i < 3; i++){
for(let j = 0; j < 3; j++){
for(let k = 0; k < 3; k++){
if(i === j || j === k || k === i) continue;
result.push([lookup[i], lookup[j], lookup[k]]);
}
}
}
return result;
}
let result = [];
let lookup = [1, 2, 3];
function recursion(count, bucket){
if(count === 0){
if(bucket[0] !== bucket[1] && bucket[1] !== bucket[2]
&& bucket[0] !== bucket[2]){
result.push(bucket);
}
return;
}
for(let i = 0; i < 3; i++){
const pick = lookup[i];
recursion(count-1, bucket.concat(pick));
}
return result;
}
console.log(recursion(3, []))
let result = [];
let lookup = [1, 2, 3];
function recursion(count, bucket){
if(count === 0){
result.push(bucket);
return;
}
for(let i = 0; i < 3; i++){
if(bucket.includes(lookup[i])) continue;
const pick = lookup[i];
recursion(count-1, bucket.concat(pick));
}
return result;
}
console.log(recursion(3, []))
조합(combination)
- 중복 X, 순서 X
- 그룹을 만드는 것
: 3개 중 2개로 요소의 중복없이 조합하는 모든 경우의 수
function forloop(){
let result = [];
let lookup = [1, 2, 3];
for(let i = 0; i < 3; i++){
for(let j = i + 1; j < 3; j++){
result.push([lookup[i], lookup[j]]);
}
}
return result;
}
let result = [];
let lookup = [1, 2, 3];
function recursion(count, bucket, k){
if(count === 0){
result.push(bucket);
return;
}
for(let i = k; i < 3; i++){
const pick = lookup[i]
recursion(count-1, bucket.concat(pick), ++k);
}
return result
}
recursion(2, [], 0)