12852번: 1로 만들기 2 Link
-> N이 주어지고 1로 만들기 위해 사용하는 연산 횟수를 구하는 문제이다.
Dynamic Programming
이용vector<pair<int, int>> minNum(int n){
vector<pair<int, int>> dp(n+1, pair<int,int>(MAX,0)); // 첫번째는 연산횟수, 두번째는 전에 index
dp[1].first = 0;
dp[1].second = 0;
for(int i=1; i<=n; i++){
if(i*3 <= n && dp[i*3].first > dp[i].first+1){
dp[i*3].first = dp[i].first+1;
dp[i*3].second = i;
}
if(i*2 <= n && dp[i*2].first > dp[i].first+1){
dp[i*2].first = dp[i].first+1;
dp[i*2].second = i;
}
if(i+1<=n && dp[i+1].first > dp[i].first+1){
dp[i+1].first = dp[i].first+1;
dp[i+1].second = i;
}
}
return dp;
}
pair<int,int>
를 이용하여 첫번째는 연산횟수, 두번째에는 전단계의 index를 저장한다.if(i*3 <= n && dp[i*3].first > dp[i].first+1)
-> if문을 통해 현재 연산횟수가 저장된것보다 작은 경우에만 저장한다.dp[i*3].first = dp[i].first+1; dp[i*3].second = i;
-> 연산횟수 & [i*3] index전에 위치한 index위치 저장하기-> 이렇게 dp 배열을 return해서 출력하기 !