Skip to content

μ‘°ν•© (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
 * /