Skip to content

[Leetcode] 39. Combination Sum ​

#μ‘°ν•©, #DFS

Problem ​

문제 링크

ν›„λ³΄λ¦¬μŠ€νŠΈμ—μ„œ 쀑볡을 ν—ˆμš©ν•˜μ—¬ ν•©ν–ˆμ„ λ•Œ target이 λ‚˜μ˜€λŠ” 경우λ₯Ό κ΅¬ν•œλ‹€.

Solution ​

DFSλ₯Ό μ΄μš©ν•˜μ—¬ λ°°μ—΄μ˜ μˆœμ„œλŒ€λ‘œ depth둜 λ“€μ–΄κ°„λ‹€. κΉŠμ€ 뎁슀둜 이동 ν•˜λ©΄μ„œ ν•΄λ‹Ή 인덱슀의 값을 λ”ν•˜κ³ , κ·Έ 값이 targetκ³Ό μΌμΉ˜ν•˜λ©΄ μ €μž₯, μ΄ˆκ³Όν•˜λ©΄ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄μ‹œμΌœ 더이상 κΉŠμ€ 뎁슀둜 μ§„μž…ν•˜λŠ” 것을 λ©ˆμΆ˜λ‹€.

λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•˜μ—¬ λͺ¨λ“  경우의 μˆ˜μ— λŒ€ν•œ 계산을 μ§„ν–‰ν•œλ‹€.

DFSλ₯Ό μ΄μš©ν•œ TS Code ​

ts
function combinationSum(candidates: number[], target: number): number[][] {
  let answer:number[][] = []
  const DFS = (sum: number, pack: number[], idx: number) => {
    if (target === sum) {
      answer.push([...pack])
      return
    }
    if (target < sum) return

    for(let i = idx; i < candidates.length; i++) {
      const candidate = candidates[i]
      DFS(
        sum + candidate,
        [...pack, candidate],
        i
      )
    }
  }

  DFS(0, [], 0)

  return answer
};

Combination μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•œ JS Code ​

javascript
/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum = function (candidates, target) {
  let answer = []

  function doCombination(idx, pickeds) {
    const sum = pickeds.reduce((acc, cur) => acc + cur, 0)
    if (target < sum) return
    if (target === sum) {
      answer.push([...pickeds])
      return
    }

    for (let i = idx; i < candidates.length; i++) {
      pickeds.push(candidates[i])
      doCombination(i, pickeds)
      pickeds.pop()
    }
  }

  doCombination(0, [])

  return answer
}