|
| 1 | +/* |
| 2 | +
|
| 3 | +1. ๋ฌธ์ ์ดํด |
| 4 | +
|
| 5 | +๋ชจ๋ ์กฐํฉ (์ค๋ณต ํ์ฉ) ์ ํตํด target ์ซ์๋ฅผ ์ฐพ๋๋ค. |
| 6 | +
|
| 7 | +2 |
| 8 | +2, 2 |
| 9 | +2, 2, 2 |
| 10 | +2, 2, 2, 2 - ์ด๊ณผ |
| 11 | +2, 2, 3 - ํ๊ฒ |
| 12 | +2, 2, 6 - ์ด๊ณผ |
| 13 | +2, 3 |
| 14 | +2, 3, 3 |
| 15 | +... |
| 16 | +6, |
| 17 | +6, 6 |
| 18 | +
|
| 19 | +
|
| 20 | +
|
| 21 | +2. ์๊ณ ๋ฆฌ์ฆ |
| 22 | +
|
| 23 | +dfs ? |
| 24 | +
|
| 25 | +3. ์์ธ ์ผ์ด์ค |
| 26 | +์ผ์น ์ผ์ด์ค ์๋ ๊ฒฝ์ฐ ? |
| 27 | +๋ค ๋๋ฉด ์์ธ๊ฐ ์์๊น ? |
| 28 | +
|
| 29 | +4. ๊ตฌํ |
| 30 | +
|
| 31 | +์ข
๋ฃ ํธ๋ฆฌ๊ฑฐ๋ ์ผ์นํ ๊ฒฝ์ฐ |
| 32 | +target ์ซ์๋ณด๋ค ๋์ ๊ฒฝ์ฐ๋ ๋ค๋ก ๊ฐ |
| 33 | +๋ค๋ก ๊ฐ์ ๋ค์ ์ซ์๋ฅผ ๋ฃ์ด ๋ณด์ |
| 34 | +
|
| 35 | +candidates ์ ๋ ฌ |
| 36 | +dfs ๋ก ์งํ, ์
๋ ฅ ํ๋ผ๋ฏธํฐ๋ ๋ํ ์ซ์ ? |
| 37 | +๋์ ๋น๊ตํด์ ๋ง์ฝ ๋ ์์ผ๋ฉด ๊ฐ์ ์ซ์ ๋ฃ๊ณ ๋ ํฌ๋ฉด ๋ค๋ก ์ด๋ |
| 38 | +
|
| 39 | +dfs ํจ์ |
| 40 | +
|
| 41 | +์๋ก์ด Num ์
๋ ฅ๋ฐ์ |
| 42 | +์
๋ ฅ๋ฐ์ ์ซ์๋ฅผ tmp ๋ฆฌ์คํธ์ ๋ํ๊ณ |
| 43 | +์ ์ฒด ํฉ์ด target ์ ๋ํด ๋์ ๊ด๊ณ ๋น๊ต |
| 44 | +
|
| 45 | +1. ํฌ๋ค๋ฉด ๋ค๋ก ์ด๋ํ๊ณ ๋ค์ ์ซ์ ์
๋ ฅ |
| 46 | +2. ๊ฐ๋ค๋ฉด result์ ๋ฃ๊ณ ๋ค๋ก ์ด๋ |
| 47 | +3. ์๋ค๋ฉด ๋์ผํ ์ซ์ ๋ฃ๊ธฐ |
| 48 | +
|
| 49 | +์ด์ํ๊ฒ dfs ๋ฅผ ๊ตฌํํ๋ค. ์์๋ ๋ง์ง ์๊ณ |
| 50 | +for๋ฌธ ๊ตฌํ, ์ธ์, ์ ๊ทผ ๋ฐฉ๋ฒ ๋ชจ๋ ํ๋ ธ๋ค. |
| 51 | +๊ธฐ์ตํ์ |
| 52 | +1. ํธ์ถ์ main ์์ dfs() ํ๋ค |
| 53 | +2. ๋ฐฑํธ๋ํน for ๋ฌธ์ dfs() ๋ด์์ ๊ตฌํํ๋ค. |
| 54 | +
|
| 55 | +๋ต๋ณ์ ๋ณด๊ณ ์ค๋ ๋ฐฑํธ๋ํน์ ์ด๋ป๊ฒ ํด์ผ๊ฒ ๋ค๋ ๊ฐ์ด ์๋ค. |
| 56 | +
|
| 57 | +๋ค๋ก ๊ฐ๋๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํ ๊น ์๊ฐํ๋๋ฐ For ๋ฌธ์์ tmp์ ์๋ก์ด ์ซ์๋ฅผ ๋ฃ๊ณ ์ ๊ฑฐํ๋ฉด์ ๊ทธ ์ฌ์ด์ dfs ๋ฅผ ๋ฃ์ผ๋ฉด ๋๋๊ฑฐ์๋ค. |
| 58 | +
|
| 59 | +์ฆ |
| 60 | +for loop |
| 61 | +tmp.add num |
| 62 | +dfs() |
| 63 | +tmp.remove num |
| 64 | +
|
| 65 | +์์ผ๋ก ๋ง์ด๋ค. |
| 66 | +
|
| 67 | +*/ |
| 68 | + |
| 69 | +import java.util.*; |
| 70 | + |
| 71 | +class Solution { |
| 72 | + private int t; |
| 73 | + private List<List<Integer>> result; |
| 74 | + |
| 75 | + public List<List<Integer>> combinationSum(int[] candidates, int target) { |
| 76 | + t = target; |
| 77 | + result = new ArrayList<>(); |
| 78 | + Arrays.sort(candidates); |
| 79 | + List<Integer> nums = new ArrayList<>(); |
| 80 | + |
| 81 | + dfs(candidates, 0, nums, 0); |
| 82 | + |
| 83 | + return result; |
| 84 | + } |
| 85 | + |
| 86 | + public void dfs(int[] candidates, int total, List<Integer> nums, int start) { |
| 87 | + if (total > t) return; // total์ด target ๋ณด๋ค ํฌ๋ค๋ฉด ์ด์ ์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด return |
| 88 | + if (total == t) { // ์ ๋ต์ผ ๊ฒฝ์ฐ ํด๋น ๊ฐ ์ถ๊ฐ ๋ฐ return |
| 89 | + result.add(new ArrayList<>(nums)); // nums ์ new ArrayList<>(nums) ์ฐจ์ด ์ดํดํ๊ธฐ |
| 90 | + // ๋น ๋ฐฐ์ด๋ก ์ ์ฅ๋๊ธธ๋ ์ ์ ๋์ ๊ฐ์ด ์ ์ฅ์๋์ง ? ๋ผ๊ณ ์๊ฐํ์ง๋ง |
| 91 | + // ๋น์ฐํ ์๋จ. ref ์ฃผ์๊ฐ์ ์ ์ฅํ์ผ๋ฏ๋ก ๋์ค์๋ ์ด Nums๊ฐ ๋ชจ๋ ๋น๋ฐฐ์ด์ด ๋๋ฏ๋ก |
| 92 | + return; |
| 93 | + } |
| 94 | + |
| 95 | + for (int i=start; i < candidates.length; i++) { // start ๋ถํฐ ์์ํ๋๊ฒ ํฌ์ธํธ! |
| 96 | + int num = candidates[i]; |
| 97 | + nums.add(num); |
| 98 | + dfs(candidates, total + num, nums, i); |
| 99 | + nums.remove(nums.size() - 1); // ๋ค์์๋ stack ์ฌ์ฉํ์ |
| 100 | + } |
| 101 | + } |
| 102 | +} |
0 commit comments