|
| 1 | +class Solution: |
| 2 | + """ |
| 3 | + ์๊ฐ ๋ณต์ก๋ (Time Complexity): |
| 4 | + - ์ด ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน(DFS) ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ํ์ํฉ๋๋ค. |
| 5 | + - ์ต์
์ ๊ฒฝ์ฐ ๊ฐ ์กฐํฉ์์ ํ ์ซ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ํธ๋ฆฌ์ ๊น์ด๋ ์ต๋ target // min(candidates) |
| 6 | + - ๊ฐ ๊น์ด๋ง๋ค ์ต๋ len(candidates)๋งํผ ๋ถ๊ธฐ ๊ฐ๋ฅ |
| 7 | + - ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ ์ง์์ ์ผ๋ก ์ฆ๊ฐ: O(2^T), T = target |
| 8 | + (์ ํํ upper bound๋ ๊ณ์ฐํ๊ธฐ ์ด๋ ต์ง๋ง, ๋๋ต์ ์ผ๋ก๋ O(2^T) ๋๋ O(k^T)๋ก ๋ณผ ์ ์์) |
| 9 | +
|
| 10 | + ๊ณต๊ฐ ๋ณต์ก๋ (Space Complexity): |
| 11 | + - ์ฌ๊ท ํธ์ถ์ ์ต๋ ๊น์ด: O(T), T = target (๊ฐ์ฅ ์์ ์ซ์๋ง ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) |
| 12 | + - ๊ฒฝ๋ก ์ ์ฅ์ฉ ๋ฆฌ์คํธ(nums): O(T) |
| 13 | + - ๊ฒฐ๊ณผ ์ ์ฅ์ฉ ๋ฆฌ์คํธ(output): ์ต์
์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ ์ ์ฅ โ O(number of valid combinations * ํ๊ท ๊ธธ์ด) |
| 14 | + ์ต์ข
๊ณต๊ฐ ๋ณต์ก๋: **O(T + R)**, |
| 15 | + T: ์ฌ๊ท ๊น์ด / R: ๊ฒฐ๊ณผ ์กฐํฉ ์๊ฐ ํด ๊ฒฝ์ฐ output์ด ์ฐจ์งํ๋ ๊ณต๊ฐ |
| 16 | + |
| 17 | + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: |
| 18 | + output, nums = [], [] |
| 19 | +
|
| 20 | + def dfs(start, total): |
| 21 | + if total > target: |
| 22 | + return |
| 23 | + if total == target: |
| 24 | + output.append(nums[:]) |
| 25 | + |
| 26 | + for i in range(start, len(candidates)): |
| 27 | + nums.append(candidates[i]) |
| 28 | + dfs(i, total + candidates[i]) |
| 29 | + nums.pop() |
| 30 | + |
| 31 | + dfs(0, 0) |
| 32 | + return output |
| 33 | + """ |
| 34 | + """ |
| 35 | + 2. dp |
| 36 | + dp[i]๋ ์ซ์๋ค์ ๋ํด์ ํฉ์ด i๊ฐ ๋๋ ๋ชจ๋ ์กฐํฉ๋ค์ ์ ์ฅํฉ๋๋ค. |
| 37 | + dp[num - candidate]์ ์๋ ์กฐํฉ์ candidate๋ฅผ ์ถ๊ฐํ๋ฉด num์ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ํ์ฅํฉ๋๋ค. |
| 38 | + ์ค๋ณต๋ ์กฐํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด candidates๋ฅผ ๋ฐ๊นฅ ๋ฃจํ์ ๋ (์ฆ, ๊ฐ์ ์ซ์๋ฅผ ๊ณ์ ์ฌ์ฌ์ฉํ๋, ์ด์ ์ซ์๋ถํฐ ๋์ ). |
| 39 | + |
| 40 | + ์๊ฐ ๋ณต์ก๋ (Time Complexity): |
| 41 | + ๋ฐ๊นฅ ๋ฃจํ: ํ๋ณด ์ซ์๋งํผ โ O(N) |
| 42 | + ์์ชฝ ๋ฃจํ: target๊น์ง ๋ฐ๋ณต โ O(T) |
| 43 | + ๊ฐ์ฅ ์์ชฝ ๋ฃจํ: dp[num - candidate]์ ์๋ ์กฐํฉ๋ค์ ๋ชจ๋ ์ํ โ O(A) (A๋ ์กฐํฉ ๊ฐ์ ๋ฐ ๊ธธ์ด์ ๋น๋ก) |
| 44 | + โ ๋ฐ๋ผ์ ์ต์
์ ๊ฒฝ์ฐ O(N ร T ร A) |
| 45 | +
|
| 46 | + ๊ณต๊ฐ ๋ณต์ก๋ (Space Complexity): |
| 47 | + dp ๋ฐฐ์ด ํฌ๊ธฐ: target + 1 โ O(T) |
| 48 | + ๊ฐ dp[i]์ ์ ์ฅ๋ ์กฐํฉ ๋ฆฌ์คํธ๋ค์ ๊ฐ์์ ๊ธธ์ด โ O(A) |
| 49 | + ๋ฐ๋ผ์ ์ ์ฒด ๊ณต๊ฐ์ O(T ร A) |
| 50 | +
|
| 51 | + Example 2์ dp ์ถ๋ ฅ: |
| 52 | +
|
| 53 | + [[[]], [], [[2]], [], [], [], [], [], []] |
| 54 | + [[[]], [], [[2]], [], [[2, 2]], [], [], [], []] |
| 55 | + [[[]], [], [[2]], [], [[2, 2]], [], [[2, 2, 2]], [], []] |
| 56 | + [[[]], [], [[2]], [], [[2, 2]], [], [[2, 2, 2]], [], [[2, 2, 2, 2]]] |
| 57 | + [[[]], [], [[2]], [[3]], [[2, 2]], [], [[2, 2, 2]], [], [[2, 2, 2, 2]]] |
| 58 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2]], [], [[2, 2, 2, 2]]] |
| 59 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2], [3, 3]], [], [[2, 2, 2, 2]]] |
| 60 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2], [3, 3]], [[2, 2, 3]], [[2, 2, 2, 2]]] |
| 61 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3]], [[2, 2, 2], [3, 3]], [[2, 2, 3]], [[2, 2, 2, 2], [2, 3, 3]]] |
| 62 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3], [5]], [[2, 2, 2], [3, 3]], [[2, 2, 3]], [[2, 2, 2, 2], [2, 3, 3]]] |
| 63 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3], [5]], [[2, 2, 2], [3, 3]], [[2, 2, 3], [2, 5]], [[2, 2, 2, 2], [2, 3, 3]]] |
| 64 | + [[[]], [], [[2]], [[3]], [[2, 2]], [[2, 3], [5]], [[2, 2, 2], [3, 3]], [[2, 2, 3], [2, 5]], [[2, 2, 2, 2], [2, 3, 3], [3, 5]]] |
| 65 | + """ |
| 66 | + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: |
| 67 | + dp = [[] for _ in range(target + 1)] |
| 68 | + dp[0] = [[]] |
| 69 | + |
| 70 | + for candidate in candidates: |
| 71 | + for num in range(candidate, target + 1): |
| 72 | + for combination in dp[num - candidate]: |
| 73 | + dp[num].append(combination + [candidate]) |
| 74 | + return dp[target] |
0 commit comments