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