1
+
2
+ //1. top-down
3
+ var coinChange = function ( coins , amount ) {
4
+ if ( amount == 0 ) return 0
5
+ /*
6
+ ์ ํ์ : dp[n] = Math.min(dp[n],dp[n-k]+1)
7
+ */
8
+ const dp = new Array ( amount + 1 ) . fill ( Math . pow ( 10 , 4 ) ) ;
9
+ for ( let c of coins ) {
10
+ dp [ c ] = 1
11
+ }
12
+ function dfs ( idx , coin ) {
13
+ if ( idx + coin > amount ) return
14
+ dp [ idx + coin ] = Math . min ( dp [ idx + coin ] , dp [ idx ] + 1 )
15
+ if ( idx + coin == amount ) {
16
+ return
17
+ } else {
18
+ for ( let c of coins ) {
19
+ //์ฌ๊ธฐ์ dfs๋ฅผ ์๋ค์ด๊ฐ๋ ๋ฐฉ๋ฒ์ ์์๊น?
20
+ dfs ( idx + coin , c )
21
+ }
22
+ }
23
+ }
24
+ dfs ( 0 , coins [ 0 ] )
25
+
26
+ if ( dp [ amount ] > amount ) return - 1
27
+
28
+ return dp [ amount ]
29
+
30
+ } ;
31
+
32
+ // ํ์๋ฆฌ๋ฐ์ ๊ฑธ๋ฆฐ๋ค. dfs์ ๊ฐ์ง์น๊ธฐ๊ฐ ๋ ๋์ด์ ๊ทธ๋ ๋ค.
33
+ // ๊ทธ๋ ๋ค๋ฉด, ์์ฐจ์ ์ธ dp๋ฅผ ์ข๋ ํ์ฉํ๋ ๊ฒ์ด ์ข์๋ณด์ธ๋ค. ํ์ฌ๋ก์๋ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ด์ ์ ์ ๋๋ก ํ์ฉํ ์ ์์ด๋ณด์ธ๋ค.
34
+
35
+
36
+
37
+ //2. bottom-up
38
+ var coinChange = function ( coins , amount ) {
39
+ coins = coins . filter ( x => x <= amount )
40
+ if ( amount == 0 ) return 0
41
+ /*
42
+ ์ ํ์ : dp[n] = Math.min(dp[n],dp[n-k]+1)
43
+ */
44
+ const dp = new Array ( amount + 1 ) . fill ( Math . pow ( 10 , 4 ) + 1 ) ;
45
+ dp [ 0 ] = 0
46
+ //dfs๋ฅผ ์ฐ๊ณ ์ถ์ง ์๋ค๋ฉด, amount๋งํผ์ for๋ฌธ์ ๋๋ฉด์ dp๋ฅผ ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
47
+ for ( let i = 1 ; i < amount + 1 ; i ++ ) {
48
+ for ( let coin of coins ) {
49
+ if ( i - coin >= 0 ) {
50
+ dp [ i ] = Math . min ( dp [ i - coin ] + 1 , dp [ i ] )
51
+ }
52
+ }
53
+ }
54
+ if ( dp [ amount ] > amount ) return - 1
55
+ return dp [ amount ]
56
+
57
+ } ;
58
+
59
+ /**
60
+ dfs๋ฅผ ์ฐ๊ณ ์ถ์ง ์๋ค๋ฉด, amount๋งํผ์ for๋ฌธ์ ๋๋ฉด์ dp๋ฅผ ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
61
+ ์ฒ์์ coins = coins.filter(x=> x<=amount)
62
+ ์ด๋ ๊ฒ ์ด ์ด์ ๋, amount๋ณด๋ค ์์ ์ฝ์ธ๋ง ํํฐํ์ฌ ์ต์ ํํ๋ค.
63
+
64
+ ์ด ๋ฌธ์ ํ์ด ์์์๊ฐ์ด 1์๊ฐ์ด ๋์๋๋ฐ,
65
+ ๊ทธ ์ด์ ๊ฐ, i-coin์ด ์๋๋ผ, i+coin์ ๊ธฐ์ค์ ์ผ์์๋ค.
66
+ ๊ทธ๋ฌ๋ค๋ณด๋ ๊ทธ๋ฌ๋ค ๋ณด๋ ๊ฐ ๊ธ์ก `i`์ ์ต์๊ฐ์ ์ฐพ๊ธฐ ์ํด `dp[i]`๋ฅผ `dp[i-coin]` ๊ธฐ๋ฐ์ผ๋ก ๊ฐฑ์ ํด์ผ ํ๋ค๋ ํต์ฌ์ ์ธ ์์ด๋์ด๋ฅผ ์ ์ฉํ๊ธฐ ์ด๋ ค์ ๋ค.
67
+ `dp[i+coin]` ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ฉด, `dp[i]` ์์ฒด๊ฐ ์์ง ์ต์ ์ ์ํ๊ฐ ์๋๋ฐ๋ ๊ทธ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฏธ๋์ `dp[i+coin]`์ ์
๋ฐ์ดํธํ๋ ค ํ๊ธฐ ๋๋ฌธ์, ์ ํํ ์ต์ ํด๋ฅผ ์ฐพ์๋ด๊ธฐ ์ด๋ ค์ ๋ค.
68
+ ํ์ฌ ๊ธ์ก `i`๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๊ณผ๊ฑฐ์ `dp[i-coin]`์์ ์ฐพ๋ '๋ฐํ
์
(Bottom-Up)' ๋ฐฉ์์ด ์ด ๋ฌธ์ ์ ํจ์ฌ ์ ํฉํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
69
+
70
+
71
+
72
+ ์๊ฐ๋ณต์ก๋: O(n * m)
73
+ ๊ณต๊ฐ ๋ณต์ก๋ : O(n)
74
+ */
0 commit comments