26
3
예로 28
은 14
에서 2
가 곱해졌을 수도 27
에서 1
이 더해졌을 수도 있다. 위 두 경우에서 더 적은 연산 수를 구하는 것이다.
1) 28->14->7->6->2->1
: 총 5번
2) 28->27->9->3->1
: 총 4번
즉, 28
은 27
에 도달하는 횟수에 +1 한 것과 14
에 도달하는 횟수에 +1한 것 중 작은 값을 택해야 한다.
2부터 28까지 각 값에 도달하는 횟수를 저장해보면 될 것이다.
ex) dp[2] = min(dp[1] + 1, dp[2/2] + 1)
dp[28] = min(dp[27] + 1, dp[28/2] + 1)
#include <iostream>
#include <algorithm>
using namespace std;
int x;
int dp[30001];
int main() {
cin >> x;
for (int i = 2; i <= x; i++) {
// 1을 빼는 경우
// ex) i = 10, 10이 되기 위해선 9에서 1을 더하는 1번의 과정 필요
dp[i] = dp[i - 1] + 1;
if (i % 2 == 0)
dp[i] = min(dp[i], dp[i / 2] + 1);
if (i % 3 == 0)
dp[i] = min(dp[i], dp[i / 3] + 1);
if (i % 5 == 0)
dp[i] = min(dp[i], dp[i / 5] + 1);
}
cout << dp[x] << "\n";
}