1+ /**
2+ * κ°μ§κ³ μλ λμ μ μ΅λν νμ©νμ¬ μ΅μμ μ‘°ν©μΌλ‘ amountλ₯Ό λ§λλ μ΅μ λμ κ°μ ꡬνλ ν¨μ
3+ *
4+ * @param {number[] } coins - μ¬μ© κ°λ₯ν λμ λ°°μ΄
5+ * @param {number } amount - λ§λ€μ΄μΌ νλ μ΄ν©
6+ * @returns {number }
7+ *
8+ * μκ° λ³΅μ‘λ O(n * m)
9+ * - nμ λμ λ°°μ΄μ ν¬κΈ°
10+ * - mμ amount
11+ *
12+ * κ³΅κ° λ³΅μ‘λ (n);
13+ * - νμ μ΅λ nκ°μ μμκ° λ€μ΄κ° μ μμ
14+ */
15+ function coinChange ( coins : number [ ] , amount : number ) : number {
16+ // μ΄ν©μ΄ 0μΈ κ²½μ° 0 λ°ν
17+ if ( amount === 0 ) return 0 ;
18+
19+ // λλΉ μ°μ νμμ νμ©ν νμ΄
20+
21+ const queue : [ number , number ] [ ] = [ [ 0 , 0 ] ] ; // [νμ¬ μ΄ν©, κΉμ΄]
22+ const visited = new Set < number > ( ) ;
23+
24+ while ( queue . length > 0 ) {
25+ const [ currentSum , depth ] = queue . shift ( ) ! ;
26+
27+ // λμ μ νλμ© λν΄μ λ€μ κΉμ΄μ νμ
28+ for ( const coin of coins ) {
29+ const nextSum = currentSum + coin ;
30+
31+ // λͺ©ν κΈμ‘μ λλ¬νλ©΄ νμ¬ κΉμ΄λ₯Ό λ°ν
32+ if ( nextSum === amount ) return depth + 1 ;
33+
34+ // μμ§ μ΄ν©μ λλ¬νμ§ μμκ³ , μ€λ³΅λμ§ μμ νμ κ°λ₯ν κ²½μ°
35+ if ( nextSum < amount && ! visited . has ( nextSum ) ) {
36+ queue . push ( [ nextSum , depth + 1 ] ) ;
37+ visited . add ( nextSum )
38+ }
39+
40+ }
41+ }
42+
43+ // νμ 쑰건μ μλ£ ν΄λ κ²½μ°μ μλ₯Ό μ°Ύμ§ λͺ»ν κ²½μ°
44+ return - 1 ;
45+ }
0 commit comments