[Kotlin/프로그래머스] 코딩테스트 연습 > 연습문제 > 숫자 변환하기

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/154538

👊 도전

1. 설계

  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. 설명

  1. 최소이므로 DP나 BFS로 구현한다
    • DP로 사용할 배열을 y+1까지 선언하고, 해당 인덱스가 자연수로 사용된다.
    • 갈 수 있는 케이스에 최소값을 저장하며, 이를 위해 Int.MAX_VALUE로 초기화한다.
    • DP로 이동하는 숫자만 탐색한다. 따라서 for문으로 순회한 값이 MAX_VALUE라면 DP로 이동한 숫자가 아니기 때문에 패스한다.

👏 해결 완료!