문제 정보

풀이

필요한 최소 연산 횟수를 구하는 문제다.

dp[i]를 ‘xi로 변환하기 위한 최소 횟수’로 정의한다.

x부터 y까지 순서대로 순회하면서, 현재 값 i에서 도달 가능한 i + n, i * 2, i * 3의 최소 횟수를 갱신한다.

코드

import java.util.*;
 
class Solution {
    public int solution(int x, int y, int n) {
        if (x == y)
            return 0;
        
        int INF = Integer.MAX_VALUE;
        int[] dp = new int[y + 1];
        
        Arrays.fill(dp, INF);
        dp[x] = 0;
        
        for (int i = x; i <= y; i++) {
            if (dp[i] == INF) continue;
            
            if (i + n <= y)
                dp[i + n] = Math.min(dp[i + n], dp[i] + 1);
            if (i * 2 <= y)
                dp[i * 2] = Math.min(dp[i * 2], dp[i] + 1);
            if (i * 3 <= y)
                dp[i * 3] = Math.min(dp[i * 3], dp[i] + 1);
        }
        
        return dp[y] == INF ? -1 : dp[y];
    }
}