September 26, 2021

문제

정수 X가 주어졌을 때, 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지입니다.

  1. X가 5로 나누어 떨어지면, 5로 나눕니다.
  2. X가 3으로 나누어 떨어지면 3으로 나눕니다.
  3. X가 2로 나누어 떨어지면 2로 나눕니다.
  4. X에서 1을 뺍니다.

정수 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;
}