μ‘°ν© (Combination) β
μ§ν©μμ μλ‘ λ€λ₯Έ nκ°μ μμ μ€μμ μμμ μκ΄μμ΄ rκ°λ₯Ό μ ννλ κ².
- μ₯μ : λͺ¨λ κ²½μ°μ μλ₯Ό ꡬν μ μλ μμ νμ.
- λ¨μ : κ²½μ°μ μκ° λ§μμ§μλ‘ κ³μ° μκ°μ΄ λμ΄λ¨.
μΈλ±μ€λ₯Ό μ΄μ©ν μ‘°ν© π β
κ²½μ°μ μλ₯Ό μμλλ‘ λ½μλΌ μ μλ μ₯μ μ΄μκ³ , μ½λλ₯Ό λ μ§κ΄μ μΌλ‘ 지 μ μμ.
javascript
const combination = (arr, r) => {
const result = []
com(result, arr, r, Array(r).fill())
return result
}
const com = (target, arr, r, picked, deep = 0, pivot = 0) => {
if (deep === r) {
target.push(picked.slice())
return
}
for (let i = pivot; i < arr.length; i++) {
picked[deep] = arr[i]
com(target, arr, r, picked, deep + 1, i + 1)
}
}
const n = 5
const r = 3
const arr = Array.from(Array(n).fill(), (_, i) => i + 1)
combination(arr, r).forEach((item) => console.log(item))
/* --------------------------------------------------------
[ 1, 2, 3 ]
[ 1, 2, 4 ]
[ 1, 2, 5 ]
[ 1, 3, 4 ]
[ 1, 3, 5 ]
[ 1, 4, 5 ]
[ 2, 3, 4 ]
[ 2, 3, 5 ]
[ 2, 4, 5 ]
[ 3, 4, 5 ]
*/
μ‘°ν© κ³μ°λ²μ μ΄μ©ν λ°©λ² β
javascript
const n = 5
const r = 3
const arr = Array.from(Array(n).fill(), (_, i) => i + 1)
const picked = Array(r)
function Combination(n, r, c) {
if (r == 0) {
console.log(picked.slice())
return
}
if (n < r) {
return
} else {
picked[r - 1] = arr[n - 1]
Combination(n - 1, r - 1, c)
Combination(n - 1, r, c)
}
}
Combination(n, r, r)
/* ---------------------------------------------
[ 3, 4, 5 ]
[ 2, 4, 5 ]
[ 1, 4, 5 ]
[ 2, 3, 5 ]
[ 1, 3, 5 ]
[ 1, 2, 5 ]
[ 2, 3, 4 ]
[ 1, 3, 4 ]
[ 1, 2, 4 ]
[ 1, 2, 3 ]
*/
ts
const combination = (nums: number[], target: number, cb?: Function, etc?: { deep:number, index:number, coms:number[] }): void => {
const { deep = 0, index = 0, coms = Array(target) } = { ...etc }
if (deep === target) {
cb && cb( ... coms )
return
}
for(let i = index; i < nums.length; i++) {
coms[deep] = nums[i]
combination(nums, target, cb, { deep: deep+1, index: i+1, coms })
}
}
combination([1,2,3,4,5],3,console.log)
/**
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
* /