Computer Science/Algorithm
[백준] 1463 - 1로 만들기 (C++)
수제햄버거
2021. 1. 13. 15:41
728x90
반응형
문제 출처 :
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
문제 풀이 :
- 입력값 n에 대해서 3으로 나눌수 있다면 3으로 나눠보고, 2로 나눌 수 있다면 2로 나눠보고 , 나머지 경우에 대해서 생각해보시는 식으로 점화식을 설계하였다.
- 재귀 함수를 통해 작성하였는데 통과는 하였다.
- 푸는 과정에서 느낀점은 DFS 처럼 이미 답이 나왔는데도 그 외의 경우도 모두 확인하는 경우가 나오는데 C++ 언어 특성상 속도에 강점이 있기 때문에 통과한거라고 생각한다(python으로 똑같은 로직으로 짠다면 시간초과가 난다)
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 987654321;
int dp[1000001];
void init_()
{
dp[1]=0;
dp[2]=1;
dp[3]=1;
dp[4]=2;
for(int i =5;i<1000001;i++)
{
dp[i]=INF;
}
}
int solve(int n){
if(dp[n]!=INF)
{
return dp[n];
}
if(n%3==0)
{
dp[n] = min(dp[n],solve(n/3)+1);
}
if(n%2==0)
{
dp[n] = min(dp[n],solve(n/2)+1);
}
dp[n]=min(dp[n],solve(n-1)+1);
return dp[n];
}
int main()
{
int num = 0;
cin >> num;
init_();
cout << solve(num)<<endl;
}
반응형