|
| 1 | +class Solution: |
| 2 | + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: |
| 3 | + result = [] |
| 4 | + |
| 5 | + def backtrack(start, current, current_sum): |
| 6 | + if current_sum == target: |
| 7 | + result.append(current[:]) |
| 8 | + return |
| 9 | + |
| 10 | + if current_sum > target: |
| 11 | + return |
| 12 | + |
| 13 | + for i in range(start, len(candidates)): |
| 14 | + current.append(candidates[i]) |
| 15 | + backtrack(i, current, current_sum + candidates[i]) |
| 16 | + current.pop() |
| 17 | + |
| 18 | + backtrack(0, [], 0) |
| 19 | + return result |
| 20 | + |
| 21 | + |
| 22 | +""" |
| 23 | +================================================================================ |
| 24 | +νμ΄ κ³Όμ |
| 25 | +================================================================================ |
| 26 | +
|
| 27 | +1. μ΄κ±° λͺ¨λ κ°λ₯ν μ‘°ν©μ μ°ΎμμΌνλλ° ν©μ΄ targetμ λμΌλ©΄ μ€λ¨λμΌνλ€? |
| 28 | +2. λ¬Έμ λ κ°μ μ«μλ₯Ό μ¬λ¬ λ² μΈ μ μλ건λ°.. |
| 29 | +3. λ°±νΈλνΉμΌλ‘ μ κ·Όν΄μΌν κ² κ°μλ°.. |
| 30 | +
|
| 31 | +
|
| 32 | +[1μ°¨ μλ] λ°±νΈλνΉ (Backtracking) |
| 33 | +ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| 34 | +4. λͺ¨λ μ‘°ν©μ νμνλ, 쑰건μ λ§μ§ μμΌλ©΄ κ°μ§μΉκΈ° |
| 35 | +5. κ°μ μ«μλ₯Ό μ¬λ¬ λ² μ¬μ©ν μ μμΌλ―λ‘ μ¬κ· νΈμΆ μ κ°μ μΈλ±μ€λΆν° μμ |
| 36 | +6. μ€λ³΅ μ‘°ν© λ°©μ§λ₯Ό μν΄ start μΈλ±μ€ μ¬μ© |
| 37 | +
|
| 38 | + result = [] |
| 39 | +
|
| 40 | + def backtrack(start, current, current_sum): |
| 41 | + # targetμ λ§μ‘±νλ©΄ κ²°κ³Όμ μΆκ° |
| 42 | + if current_sum == target: |
| 43 | + result.append(current[:]) # 볡μ¬ν΄μ μΆκ° |
| 44 | + return |
| 45 | +
|
| 46 | + # κ°μ§μΉκΈ°: ν©μ΄ target μ΄κ³Ό |
| 47 | + if current_sum > target: |
| 48 | + return |
| 49 | +
|
| 50 | + # μ‘°ν© νμ |
| 51 | + for i in range(start, len(candidates)): |
| 52 | + current.append(candidates[i]) |
| 53 | + # κ°μ μ«μ μ¬μ¬μ© κ°λ₯νλ―λ‘ iλΆν° μμ |
| 54 | + backtrack(i, current, current_sum + candidates[i]) |
| 55 | + current.pop() # λ°±νΈλνΉ: μν 볡μ |
| 56 | +
|
| 57 | + backtrack(0, [], 0) |
| 58 | + return result |
| 59 | +
|
| 60 | +7. Example: candidates = [2,3,6,7], target = 7 |
| 61 | +
|
| 62 | + backtrack(0, [], 0) |
| 63 | + ββ 2 μΆκ° β backtrack(0, [2], 2) |
| 64 | + β ββ 2 μΆκ° β backtrack(0, [2,2], 4) |
| 65 | + β β ββ 2 μΆκ° β backtrack(0, [2,2,2], 6) |
| 66 | + β β β ββ 2 μΆκ° β backtrack(0, [2,2,2,2], 8) β 8 > 7 return |
| 67 | + β β ββ 3 μΆκ° β backtrack(1, [2,2,3], 7) β 7 == 7 β
[2,2,3] |
| 68 | + β ββ 3 μΆκ° β backtrack(1, [2,3], 5) |
| 69 | + β ββ ... (νμ κ³μ) |
| 70 | + ββ 7 μΆκ° β backtrack(3, [7], 7) β 7 == 7 β
[7] |
| 71 | +
|
| 72 | +8. μκ° λ³΅μ‘λ: O(N^(T/M)) |
| 73 | + - N: candidates κΈΈμ΄ |
| 74 | + - T: target κ° |
| 75 | + - M: candidatesμ μ΅μκ° |
| 76 | +9. κ³΅κ° λ³΅μ‘λ: O(T/M) - μ¬κ· νΈμΆ μ€ν κΉμ΄ |
| 77 | +""" |
0 commit comments