import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static Integer[] dp;
static int recur(int N) {
if (dp[N] == null) {
if (N % 6 == 0) {
dp[N] = Math.min(recur(N - 1), Math.min(recur(N/3), recur(N/2))) + 1;
}
else if (N % 3 == 0) {
dp[N] = Math.min(recur(N / 3), recur(N - 1)) + 1;
}
else if (N % 2 == 0) {
dp[N] = Math.min(recur(N / 2), recur(N - 1)) + 1;
}
else {
dp[N] = recur(N - 1) + 1;
}
}
return dp[N];
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
dp = new Integer[N+1];
dp[0] = dp[1] = 0;
System.out.print(recur(N));
}
}
초기에 N을 어떻게 1로 만들지 반복문과 조건문을 생각해서 풀려고 했다. 무조건 3으로 나눠지게 로직을 짜려 했는데 체점할때 1초만에 틀렸다고 나왔다...
DP문제라는 것을 인지
점화식과 배열에 메모라이징하기
배열에 저장하고 꺼내쓰는 것이 시간복잡도를 어마어마하게 줄여준다.