Programmers Review

[Lv 2] 숫자 변환하기

hanseongbugi 2024. 5. 15. 18:33

 

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

 

프로그래머스

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

programmers.co.kr

 

이 문제는 DP를 사용해 해결할 수 있다.

숫자 x를 y로 만드는 방법은 3가지가 있다.

1. n을 x에 더하기

2. x에 2를 곱하기

3. x에 3을 곱하기

 

위 방식을 생각해 본다면 y에서 x로 1씩 감소시키면서 반복을 진행할 때 1씩 감소시킨 값이 3이나 2로 나누어 떨어지거나 n과 뺐을 때 0보다 큰 경우 계속해서 연산할 수 있다는 것을 알 수 있다.

따라서 연산이 가능할 때 연산 횟수가 최소인 경우를 구하면된다.

즉, DP 배열에 연산이 가능할 때 연산 횟수를 누적하고 누적한 값을 최소로 만든다.

반복이 끝났을 때 DP[x]에는 최소 연산 횟수가 남아 있을 것이고, 배열을 초기화 한 값으로 남아 있다면 -1을 반환한다.

 

#include <string>
#include <vector>

using namespace std;

int dp[1000001] = {0,};

int solution(int x, int y, int n) {
    int answer = 0;
    for(int i = 0;i<=1000001;i++)
        dp[i] = 1000001;
    
    dp[y] = 0;
    
    for(int i = y;i>x;i--){
        
        if(dp[i] != 1000001){
            if(i%3 ==0)
                dp[i/3] = min(dp[i/3], dp[i] + 1);
            
            if(i % 2 == 0)
                dp[i/2] = min(dp[i/2], dp[i] + 1);
            
            if(i - n > 0)
                dp[i - n] = min(dp[i-n], dp[i] + 1);
        }
    }
    if(dp[x] == 1000001)
        dp[x] = -1;
    answer = dp[x];
    return answer;
}