Algorithm/Problem Solve

[백준 1463번] 1로 만들기

아네스 2020. 12. 21. 13:45
반응형

dp배열을 미리 생성한 뒤 값을 찾는다.

dp인줄 모르고 풀어야하는데.. 궁금해서 알고리즘 분류 봤더니 dp로 바로 풀게됐다.. 

 

어느때 dp로 풀어야할까 ? 

N 값을 보면 N이전의 값을 참조해야하는데, 이렇게 반복적으로 참조되는경우 dp로 풀면 시간단축할 수 있다.

 

#include <bits/stdc++.h>

using namespace std;
int dp[1000001]; //크기 유의, 10^6 인걸 10만으로 잡았다가 계속 런타임에러 ㅠ
int main(void)
{

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int N;
    cin >> N;
    dp[0] = 0;
    dp[1] = 0;
    for(int i = 2; i<=N+1 ; i++)
    {
    	//3, 2 모두 나누어 떨어지는경우
        if( i%3 == 0 && i%2 == 0) 
        {
        	//3으로 나눴을때 dp값, 2로 나눴을때 dp값, i-1일때 dp값 중 minimum
            dp[i] = min(dp[i/3]+1, min(dp[i/2]+1, dp[i-1]+1));
        }
        // 3으로만 나누어 떨어지는경우
        else if( i%3 ==0 && i%2 != 0) 
        {
        	//3으로 나눴을때 dp값,i-1일때 dp값 중 minimum
            dp[i] = min(dp[i/3]+1, dp[i-1]+1);
        }
        //2로만 나누어떨어지는 경우
        else if( i%3 != 0 && i%2 ==0)
        {
        	//2로 나눴을때 dp값,i-1일때 dp값 중 minimum
            dp[i] = min(dp[i/2]+1, dp[i-1]+1);
        }
        //아예 안나눠떨어지는경우.
        else {
            dp[i] = dp[i-1]+1;
        }
    }
    cout << dp[N] << endl;
}
반응형