September 26, 2021
정수 X가 주어졌을 때, 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지입니다.
정수 X가 주어졌을 때, 연산 4개를 적절히 사용해서 값을 1로 만들고자 합니다. 연산을 사용하는 횟수의 최솟값을 출력하세요.
1초
128MB
첫째 줄에 정수 X가 주어집니다.(1≤X≤30,000)
첫째 줄에 연산을 하는 최솟값을 출력합니다.
#include <stdio.h>
using namespace std;
int X, min, tmpResult;
int dp[30001];
int makeOne(int num) {
printf("%d\\n", num);
if (num == 1) return 0;
else if (dp[num] != 0) return dp[num];
else {
min = 123456789;
if (num % 3 == 0) {
tmpResult = makeOne(num / 3);
min = (min < tmpResult ? min : tmpResult);
}
if (num % 5 == 0) {
tmpResult = makeOne(num / 5);
min = (min < tmpResult ? min : tmpResult);
}
if (num % 2 == 0) {
tmpResult = makeOne(num / 2);
min = (min < tmpResult ? min : tmpResult);
}
tmpResult = makeOne(num - 1);
min = (min < tmpResult ? min : tmpResult);
dp[num] = min + 1;
return min + 1;
}
}
int main() {
scanf("%d", &X);
printf("%d", makeOne(X));
return 0;
}