|
| 1 | +"""TC: O(m^n), SC: O(m^n) |
| 2 | +
|
| 3 | +candidates์ ์๋ ๊ฐ์ ๊ฐ์: m |
| 4 | +target์ ํฌ๊ธฐ: n |
| 5 | +
|
| 6 | +์์ด๋์ด: |
| 7 | +candidates(์ดํ cands)์ ์๋ ์ซ์๋ค์ ๋ํด์ k๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ f(k)๋ผ๊ณ ํ์. |
| 8 | +f(k)๋ ๋ค์์ ๊ฒฝ์ฐ๋ค์ ์ข
ํฉํ ๊ฒ์ด๋ค. |
| 9 | + - cands์ ์๋ c1์ ๋ง์ง๋ง์ผ๋ก ๋ํด์ k๋ฅผ ๋ง๋ค์๋ค. ์ฆ, f(k-c1)์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋์ c1์ ๋ํจ. |
| 10 | + - cands์ ์๋ c2๋ฅผ ๋ง์ง๋ง์ผ๋ก ๋ํด์ k๋ฅผ ๋ง๋ค์๋ค. ์ฆ, f(k-c2)์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋์ c2์ ๋ํจ. |
| 11 | + ... |
| 12 | + - cands์ ์๋ cm์ ๋ง์ง๋ง์ผ๋ก ๋ํด์ k๋ฅผ ๋ง๋ค์๋ค. ์ฆ, f(k-cm)์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋์ cm์ ๋ํจ. |
| 13 | +
|
| 14 | +์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๋, ํ๋์ ๊ฐ์ ๋ง๋๋ ๋ฐ์ ์ค๋ณต๋ ๊ฒฝ์ฐ๊ฐ ๋์ฌ ์ ์๋ค๋ ๊ฒ์ด๋ค. |
| 15 | +e.g.) candidates = [2, 3], target = 5 |
| 16 | +f(2) = [[2]] |
| 17 | +f(3) = [[3]] |
| 18 | +์์ ๊ฐ์ ํ์ฉํด์ f(5)๋ฅผ ๊ตฌํ๋ฉด |
| 19 | +f(5) = [f(2)์ ๋ฐฉ๋ฒ๋ค์ ๋์ 3์ ๋ถ์] + [f(3)์ ๋ฐฉ๋ฒ๋ค์ ๋์ 2๋ฅผ ๋ถ์] |
| 20 | + = [[2, 3]] + [[3, 2]] |
| 21 | + = [[2, 3], [3, 2]] |
| 22 | +
|
| 23 | +๊ทธ๋์ ๋ง์ง๋ง์ ๊ฐ์ ์์ดํ
์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ๋ฅผ ์ฐพ์์ ์ค๋ณต์ ์ ๊ฑฐํด์ค๋ค. |
| 24 | +
|
| 25 | +์ด๋ฒ ๋ฌธ์ ์์๋ [2, 2, 3], [2, 3, 2], [3, 2, 2] ๊ฐ์ด ๋ค์ด๊ฐ๋ ์์ดํ
์ ์์๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ๊ฒ์ผ๋ก |
| 26 | +๋ณด์๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ ์ค๋ณต์ ์ ๊ฑฐํ์ง๋ง, ๋ง์ฝ ์ด๋ค์ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด๋ ๋ฌธ์ ๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ์์ |
| 27 | +๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๋ฆฌํดํ๋ฉด ๋๋ค. |
| 28 | +
|
| 29 | +
|
| 30 | +SC: |
| 31 | +- ๋ฌธ์ ํน์ฑ์ f(i)์ ๋ค์ด๊ฐ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ |
| 32 | + - i๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ธธ์ด๋ O(i). |
| 33 | + - cands์ 1์ด ์๊ณ ์ด 1๋ก ๊ฐ๋ ์ฑ์ด ๋ฐฉ๋ฒ [1, 1, ..., 1]์ ์๊ฐํ๋ฉด ํธํ๋ค. |
| 34 | + - cands์ ์ต์๊ฐ์ด ์ด๋ค ์์ x๋ผ๊ณ ํด๋ [x, x, ..., x]์๋ i/x๊ฐ ๋ค์ด๊ฐ๋๋ฐ, O(i/x)๋ O(i). |
| 35 | + - ๊ฐ ๋ฐฉ๋ฒ์ ๋ค์ด์๋ ์์ดํ
์ m๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ๊ฐ๋ฅ. [(c1, c2, ..., cm ์ค ํ๋), ..., (c1, c2, ..., cm ์ค ํ๋)] |
| 36 | + - ์ฆ, f(i)์๋ O(m^i)๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋ค์ด๊ฐ ์ ์๋ค. |
| 37 | +- f(1), f(2), ..., f(n)์ ๋ค ๋ํ๋ฉด O(m^1) + O(m^2) + ... + O(m^n) = O(m^n)์ด ๋๋ค. |
| 38 | +- ์ฆ, O(m^n). |
| 39 | +
|
| 40 | +TC: |
| 41 | +- ์์ SC์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. O(m^n). |
| 42 | +""" |
| 43 | + |
| 44 | + |
| 45 | +class Solution: |
| 46 | + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: |
| 47 | + dp = [[] for _ in range(target + 1)] # ์ด๊ธฐํ. |
| 48 | + dp[0] = [[]] # 0์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ฌด ์ซ์๋ ๋ฃ์ง ์๋ ๊ฒ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. |
| 49 | + for cur in range(1, target + 1): # f(i)๋ฅผ 1๋ถํฐ ๊ณ์ฐํด๋๊ฐ๋ฉด์ ์ฑ์ฐ๊ธฐ ์์. |
| 50 | + for cand in candidates: |
| 51 | + prev = cur - cand |
| 52 | + if prev >= 0: |
| 53 | + dp[cur] += [combi + [cand] for combi in dp[prev]] |
| 54 | + |
| 55 | + # ๋ง์ง๋ง์ ์ค๋ณต๋ ๊ฒฝ์ฐ๋ฅผ ์ ๊ฑฐํด์ค๋ค. |
| 56 | + return list(set([tuple(sorted(i)) for i in dp[target]])) |
| 57 | + |
| 58 | + |
| 59 | +""" |
| 60 | +์์ด๋์ด: |
| 61 | +์ค๊ฐ์ค๊ฐ ๊ณ์ฐํ๋ฉด์ ์ค๋ณต๋ ๊ฐ์ ์ ๊ฑฐํ๋ฉด์ f(i)๊ฐ์ ๊ด๋ฆฌํ๋ ์์ผ๋ก ์ปคํ
ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. |
| 62 | +๊ฐ ๋ฐฉ๋ฒ์ [c1, ...c1, c2, ..., c2, ... , cm, ..., m] ๊ผด์ด ๋๋๋ฐ, |
| 63 | + [ ^ ^ ... ^ ] |
| 64 | +๊ฐ f(i)๋ง๋ค ์์ `^` ํ์๋ฅผ ํด๋ ๊ณณ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์๋งํผ ๊ณต๊ฐ์ด ํ์ํ๋ค. |
| 65 | +์ด ์ซ์๋ ๋๋ต (i choose m-1)์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค. |
| 66 | +
|
| 67 | +๊ทธ๋ฌ๋ฏ๋ก SC์ TC ๋ชจ๋ O(n choose m) = O((n/m)^m)...? |
| 68 | +(ref: https://en.wikipedia.org/wiki/Binomial_coefficient#Bounds_and_asymptotic_formulas) |
| 69 | +""" |
| 70 | + |
| 71 | + |
| 72 | +class Solution: |
| 73 | + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: |
| 74 | + dp = [[] for _ in range(target + 1)] |
| 75 | + dp[0] = [[]] |
| 76 | + for cur in range(1, target + 1): |
| 77 | + for cand in candidates: |
| 78 | + prev = cur - cand |
| 79 | + if prev >= 0: |
| 80 | + dp[cur] += [combi + [cand] for combi in dp[prev]] |
| 81 | + dp[cur] = list(set([tuple(sorted(i)) for i in dp[cur]])) |
| 82 | + return list(set([tuple(sorted(i)) for i in dp[target]])) |
| 83 | + |
| 84 | + |
| 85 | +""" |
| 86 | +์์ด๋์ด: |
| 87 | +๋ง๋ค๊ณ ๋์ ์ค๋ณต๋ ๊ฒฝ์ฐ๋ฅผ ์ ๊ฑฐํ์ง ๋ง๊ณ , ์ฒ์๋ถํฐ ์ค๋ณต๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ง ์๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค. |
| 88 | +๊ฐ ๋ฐฉ๋ฒ๋ง๋ค ํด๋น ๋ฐฉ๋ฒ์์ ์ฌ์ฉํ ์ต๋ candidate ์ธ๋ฑ์ค๋ฅผ ๋ฌ์๋๊ณ , ์ดํ ํด๋ฅผ ๊ตฌํ ๋๋ ํด๋น |
| 89 | +์ธ๋ฑ์ค ์ด์์ candidate๋ง ์ถ๊ฐํ ์ ์๋๋ก ๋จ์๋ฅผ ๋ฌ์๋๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค. |
| 90 | +e.g.) candidate = [2, 5, 3] |
| 91 | +f(10)์ ๋ค์ด์์ ์ ์๋ ๋ฐฉ๋ฒ์ |
| 92 | +- ([2, 2, 2, 2, 2], 0) : ๋ง์ง๋ง ์์ดํ
์ดํ์ 2, 5, 3 ์ ๋ถ ๋ฑ์ฅ ๊ฐ๋ฅ. |
| 93 | +- ([5, 5], 1) : ๋ง์ง๋ง ์์ดํ
์ดํ์ 5, 3๋ง ๋ฑ์ฅ ๊ฐ๋ฅ. |
| 94 | +- ([2, 5, 3], 2) : ๋ง์ง๋ง ์์ดํ
์ดํ์ 3๋ง ๋ฑ์ฅ ๊ฐ๋ฅ. |
| 95 | +- ([2, 2, 3, 3], 2) : ๋ง์ง๋ง ์์ดํ
์ดํ์ 3๋ง ๋ฑ์ฅ ๊ฐ๋ฅ. |
| 96 | +
|
| 97 | +SC์ TC๋ ๋ฐ๋ก ์์์ O(n choose m)์ ๊ณ์ฐํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. |
| 98 | +""" |
| 99 | + |
| 100 | + |
| 101 | +class Solution: |
| 102 | + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: |
| 103 | + dp = [[] for _ in range(target + 1)] |
| 104 | + dp[0] = [([], 0)] # (๋ฐฉ๋ฒ, ์ฌ์ฉ ๊ฐ๋ฅํ candidate index ์ต์๊ฐ) ์. |
| 105 | + for cur in range(1, target + 1): |
| 106 | + for i in range(len(candidates)): |
| 107 | + prev = cur - candidates[i] |
| 108 | + if prev >= 0: |
| 109 | + dp[cur] += [ |
| 110 | + (combi[0] + [candidates[i]], i) |
| 111 | + for combi in dp[prev] |
| 112 | + if i >= combi[1] |
| 113 | + ] |
| 114 | + return [i[0] for i in dp[target]] # ๋ฐฉ๋ฒ๋ง ์ถ์ถํด์ ๋ฆฌํดํ๋ค. |
0 commit comments