JAVA/Coding Test

[JAVA] 숫자 변환하기_DP

오늘도개발 2024. 7. 12. 19:44

 

문제 : 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

접근 : 

 

* dp[x] => x 숫자를 만들기 위해서 연산되는 최소 횟수

 

  - x 부터 시작하여 y까지 2배, 3배, +n 연산을 하여 그 결과 값을 배열의 해당 인덱스에 입력한다.

   > dp[2*x] = dp[x] + 1

 

  - 만약 해당 인덱스에 값이 이미 존재한다면 현재 계산값과 해당 인덱스의 데이터 값 중 작은 값을 유지한다.

   > dp[temp] = (dp[temp] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[temp]);

 

  - dp[y] 값을 출력한다. 

 

 

코드 구현 : 

 

class Solution {
    public int solution(int x, int y, int n) {
        int[] dp = new int[y + 1];
        int temp;
        int[] nums = new int[]{2, 3, n};

        if(2*x <= y) dp[2*x] = dp[x] + 1;
        if(3*x <= y) dp[3*x] = dp[x] + 1;
        if(n+x <= y) dp[n+x] = dp[x] + 1;

        for (int i = x+1 ; i <= y ; i++) {
            if (dp[i] == 0) {
                dp[i] = -1;
                continue;
            }
            for(int j = 0 ; j < nums.length ; j++){
                temp = (j == nums.length-1) ? nums[j] + i : nums[j] * i;
                if (temp > y) continue;
                dp[temp] = (dp[temp] == 0) ? dp[i] + 1 : Math.min(dp[i] + 1, dp[temp]);
            }
        }
    return dp[y];
    }
}