|
| 1 | +/* |
| 2 | +1. ๋ฌธ์ ์ดํด |
| 3 | +์ซ์๋ค์ ์กฐํฉํด์ ํ๊ฒ ๋๋ฒ๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ฅ ์์ ์ฝ์ธ์ ๊ฐ์๋ฅผ ๋ฐํ |
| 4 | +๋ง์กฑํ๋ ์กฐํฉ์ด ์๋ค๋ฉด -1 ๋ฐํ |
| 5 | +
|
| 6 | +๋ฐฐ์ด ์ ๋ ฌ ํ ์์ ์ซ์๋ถํฐ ์์ํด์ ๋ํ๋ฉฐ ํ๊ฒ๋๋ฒ์ ์ผ์นํ๋์ง ์ฒดํฌ |
| 7 | +์ผ์นํ๋ค๋ฉด ๊ทธ๋์ ์ฝ์ธ ๊ฐ์๋ฅผ ๊ธฐ์กด ๊ฐ์์ ๋น๊ต ๋ฐ ์ด๊ธฐํ |
| 8 | +๋ง์ฝ ํฌ๋ค๋ฉด return ํ์ฌ ๋ค์ ์ซ์๋ก ์ด๋ |
| 9 | +
|
| 10 | +2. ์์ธ ์ํฉ |
| 11 | +
|
| 12 | +output์ด 12๊ฐ ๋๋ ๊ฒฝ์ฐ์ 0์ด ๋๋ ๊ฒฝ์ฐ๋ ๊ฐ๊ฐ ๋ฌด์จ ๊ฒฝ์ฐ์ผ๊น ? |
| 13 | +
|
| 14 | +12๊ฐ ๋๋ ๊ฒฝ์ฐ๋ ์ด๋ค ์กฐํฉ์ผ๋ก๋ ํ๊ฒ๋๋ฒ๋ฅผ ๋ง๋ค์ง ๋ชปํ์ ๊ฒฝ์ฐ |
| 15 | +
|
| 16 | +0์ด ๋๋ ๊ฒฝ์ฐ๋ amount๊ฐ 0์ผ ๊ฒฝ์ฐ ์๋ฌด ์ซ์๋ ๋ฐํ๋๋ฉด ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๊ฐ์ฅ ์ฒ์ ์ด๊ธฐํ ๋๊ณ ๋ฐ๋ก ๋ฆฌํด๋จ. |
| 17 | +
|
| 18 | +3. ์๊ณ ๋ฆฌ์ฆ |
| 19 | +dfs |
| 20 | +
|
| 21 | +4. ๊ตฌํ |
| 22 | +์๋ ์ฝ๋ |
| 23 | +dfs(์ฌ์ฉํ ์ฝ์ธ ๊ฐ์, ์ง๊ธ๊น์ง์ ๊ฐ) |
| 24 | +ํ์ฌ ๊ฐ == ํ๊ฒ ๊ฐ ์ฒดํฌ |
| 25 | +๋ง๋ค๋ฉด ์ต์๊ฐ ์ด๊ธฐํ |
| 26 | +๋ฐํ |
| 27 | +
|
| 28 | +for coins |
| 29 | +์ง๊ธ๊น์ง์ ๊ฐ + ์๋ก์ด ์ฝ์ธ <= ํ๊ฒ ๊ฐ |
| 30 | +๋ง๋ค๋ฉด dfs(์ฌ์ฉํ ์ฝ์ธ ๊ฐ์ + 1, ์ง๊ธ๊น์ง์ ๊ฐ + ์๋ก์ด ์ฝ์ธ) |
| 31 | +
|
| 32 | +dp |
| 33 | +
|
| 34 | +์ฌ๊ท๋ก ํ์์ผ๋ Time limit์ด ๊ฑธ๋ฆฌ์ง ์๊ธฐ ์ํด dp๋ก๋ ํ ์ ์๋ ์ ์ ๊ณ ๋ คํ ์ ์๋ค. |
| 35 | +
|
| 36 | +dp ์ ํ์์ ๋ง๋ค์ด ๋ณด์ |
| 37 | +n ์์ ๋ง๋ค๊ธฐ ์ํ ๋์ ์ ์ต์ ๊ฐ์์ด๋ฏ๋ก |
| 38 | +n์ด ๋ง๋ค๊ณ ์ถ์ ๊ธ์ก, coin์ด ํ์ฌ ์ ํํ ๋์ ์ด๋ผ๊ณ ํ ๋ |
| 39 | +dp[n] = min(dp[n], dp[n-coin] + 1) ์ด ๋์จ๋ค. |
| 40 | +n-coin ์ด ๋์ค๊ฒ๋ ์ด์ ๋ n์ ๋ง๋ค๊ธฐ ์ํด ํน์ ์ซ์์์ coin ๋ํ์ฌ n ์ ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. |
| 41 | +x + coin = n -> x = n - coin ์์ด ๋ง๋ค์ด ์ง๋ค. |
| 42 | +ํด๋น n-coin ์ ๋ง๋ค๊ธฐ ์ํ ์ต์๊ฐ์์ coin์ ๋ํ์ผ๋ฏ๋ก 1์ ๋ํด์ค์ผ๋ก์จ |
| 43 | +์ ํํ coin ์์ n ์ ๋ง๋ค๊ธฐ ์ํ ์ต์ ๊ฐ์๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. |
| 44 | +
|
| 45 | +*/ |
| 46 | + |
| 47 | +import java.util.*; |
| 48 | + |
| 49 | +class Solution { |
| 50 | + private int min; |
| 51 | + public int coinChange(int[] coins, int amount) { |
| 52 | + // int maxLength = 12; |
| 53 | + // min = maxLength + 1; |
| 54 | + // dfs(0, 0, amount, coins); |
| 55 | + // if (min == 13) { |
| 56 | + // return -1; |
| 57 | + // } |
| 58 | + |
| 59 | + int[] dp = new int[amount + 1]; |
| 60 | + |
| 61 | + |
| 62 | + for (int i=1; i<dp.length; i++) { |
| 63 | + dp[i] = amount + 1; // ์ต๋๊ฐ๋ณด๋ค 1์ ๋ํ์ฌ ๋ฌดํจํ ๊ฐ(์ต๋๊ฐ๋ณด๋ค ํด ์ ์์)์ ์์๋ก ๋ฃ์ด์ค๋ค. |
| 64 | + } |
| 65 | + dp[0] = 0; |
| 66 | + // coin ๋ค์ ์ํํ๋ฉฐ ๊ฐ ์ฝ์ธ๋ค์ ๋ฃจํ๋ง๋ค ํด๋น ๋์ ์ผ๋ก ์ต์ ํ๋ฅผ ํ๋ค. ๊ทธ๋์ 3๋ฒ์งธ ๋์ ์ ๋๋์๋ ์ด์ 1, 2๋ฒ์งธ์ ๋์ ๋ค์ ๋ํด ๋์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋๋ค. |
| 67 | + for (int c : coins) { |
| 68 | + // c ๋ถํฐ ์์ํ๋ ์ด์ ๋ ๊ฐ์ง๊ณ ์๋ ์ฝ์ธ๋ณด๋ค ์ ์ n ์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ |
| 69 | + for (int n = c; n < amount + 1; n++) { |
| 70 | + dp[n] = Math.min(dp[n], dp[n-c] + 1); |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + if (dp[amount] == amount + 1) { |
| 75 | + return -1; |
| 76 | + } |
| 77 | + |
| 78 | + return dp[amount]; |
| 79 | + } |
| 80 | + |
| 81 | + |
| 82 | + // ์๊ฐ ์ด๊ณผ ๋ฐ์ |
| 83 | + // public void dfs(int count, long total, int amount, int[] coins) { |
| 84 | + // if (total == amount) { |
| 85 | + // min = Math.min(min, count); |
| 86 | + // return; |
| 87 | + // } |
| 88 | + |
| 89 | + // for (int coin: coins) { |
| 90 | + // if (total + coin <= amount) { |
| 91 | + // dfs(count + 1, total + coin, amount, coins); |
| 92 | + // } |
| 93 | + // } |
| 94 | + // } |
| 95 | +} |
| 96 | + |
0 commit comments