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