|
| 1 | +/** |
| 2 | + * BFS ๋ ๋๋น ์ฐ์ ์ด๋ฏ๋ก, ๊ฐ์ฅ ์์ ๊น์ด๋ก ๋ชฉํ ๊ธ์ก์ ๋ง์กฑํ๋ฉด '์ต์ ๋์ ๊ฐ์'๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. |
| 3 | + * ๋๋น == ์ฌ์ฉํ ๋์ ๊ฐ์ |
| 4 | + * |
| 5 | + * Queue<Integer> ๋์ ๊ธ์ก 'ํฉ' ์ ๊ด๋ฆฌํฉ๋๋ค |
| 6 | + * |
| 7 | + * ๋ชฉํ ๊ธ์ก์ด amount ์ผ ๋, |
| 8 | + * 0 ๋ถํฐ amount ๊น์ง์ ํฉ์ ์ฒดํฌํ boolean[] ์ ํ์ฉํฉ๋๋ค. |
| 9 | + * ํฉ๊ณ ๊ธ์ก์ด '์ด๋ฏธ ๋ง๋ค์ด๋ณธ ํฉ' ์ด๋ฉด boolean[] ์ ์ฒดํฌํ์ฌ ์ค๋ณต๋ฐฉ๋ฌธ์ ๋ฐฉ์งํ๊ธฐ ์ํจ. |
| 10 | + * |
| 11 | + */ |
| 12 | +class Solution { |
| 13 | + public int coinChange(int[] coins, int amount) { |
| 14 | + if (amount == 0) return 0; // ๋ชฉํ ๊ธ์ก 0์ธ ๊ฒฝ์ฐ, '0๊ฐ' ๋ฆฌํด |
| 15 | + |
| 16 | + Arrays.sort(coins); // ์์ ๋์ ๋ถํฐ ๋ํด๋ณธ๋ค |
| 17 | + |
| 18 | + // ์ด๋ฏธ ๋ง๋ค์ด๋ณธ 'ํฉ' ์ ์ง๋๊ฐ๋๋ก. |
| 19 | + boolean[] visitedAmount = new boolean[amount + 1]; |
| 20 | + // ํฉ |
| 21 | + Queue<Integer> amountQueue = new ArrayDeque<>(); |
| 22 | + |
| 23 | + amountQueue.add(0); // ์์ ๊ธ์ก 0 |
| 24 | + visitedAmount[0] = true; |
| 25 | + |
| 26 | + int coinCount = 0; // ์ฌ์ฉํ ๋์ ๊ฐ์ |
| 27 | + |
| 28 | + while(!amountQueue.isEmpty()) { |
| 29 | + coinCount++; // ์ฌ์ฉํ ๋์ ๊ฐ์ 1๊ฐ ์ฆ๊ฐ |
| 30 | + |
| 31 | + int queueSize = amountQueue.size(); |
| 32 | + |
| 33 | + for(int i = 0; i < queueSize; i++) { |
| 34 | + // ํ์ฌ ๊ธ์ก ํฉ |
| 35 | + int currentAmount = amountQueue.poll(); |
| 36 | + |
| 37 | + // ๋ชจ๋ ์ฝ์ธ์ ๋ํด๋ณธ๋ค |
| 38 | + for(int coin : coins) { |
| 39 | + // ์ฝ์ธ์ ๋ํด ๋ณธ ํฉ. |
| 40 | + int tempAmount = currentAmount + coin; |
| 41 | + |
| 42 | + if (tempAmount == amount) return coinCount; // ์ต์ ๋์ ๊ฐ์ ์ฐพ์ |
| 43 | + |
| 44 | + // ์ฒ์ ๋ง๋ ํฉ ์ด๊ณ , ๋ชฉํ ๊ธ์ก๋ณด๋ค ์ ์ ํฉ์ด๋ผ๋ฉด, |
| 45 | + if (tempAmount < amount && !visitedAmount[tempAmount]) { |
| 46 | + visitedAmount[tempAmount] = true; |
| 47 | + amountQueue.add(tempAmount); |
| 48 | + } |
| 49 | + } |
| 50 | + } |
| 51 | + } |
| 52 | + return -1; |
| 53 | + } |
| 54 | +} |
0 commit comments