👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/154538
👊 도전
1. 설계
- 문제 설명대로 구현
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import kotlin.math.min
class Solution {
fun solution(x: Int, y: Int, n: Int): Int {
/**
* dp
* dp[y+1]까지 Int.MAX으로 선언하고
* x부터 시작하는데
* x+n, *2, *3인 위치에 dp[i], dp[x]+1의 min을 저장
*/
val dp = IntArray(y+1){ Int.MAX_VALUE }
dp[x] = 0
for(i in x..y) {
if (dp[i] != Int.MAX_VALUE) {
if (i+n <=y) dp[i+n] = min(dp[i+n], dp[i]+1)
if (i*2 <=y) dp[i*2] = min(dp[i*2], dp[i]+1)
if (i*3 <=y) dp[i*3] = min(dp[i*3], dp[i]+1)
}
}
return if (dp[y] == Int.MAX_VALUE) -1 else dp[y]
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 최소이므로 DP나 BFS로 구현한다
- DP로 사용할 배열을 y+1까지 선언하고, 해당 인덱스가 자연수로 사용된다.
- 갈 수 있는 케이스에 최소값을 저장하며, 이를 위해 Int.MAX_VALUE로 초기화한다.
- DP로 이동하는 숫자만 탐색한다. 따라서 for문으로 순회한 값이 MAX_VALUE라면 DP로 이동한 숫자가 아니기 때문에 패스한다.