https://www.acmicpc.net/problem/1463
(정답률 32.749%)
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
10의 경우에 10->9->3->1로 3번 만에 만들 수 있다.
10
3
import java.io.*;
public class Main {
static Integer[] dp; //메모이제이션 배열
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int x = Integer.parseInt(br.readLine());
dp = new Integer[x + 1];
dp[0] = dp[1] = 0; //래퍼 클래스의 배열의 기본 값은 null이므로 0과 1엔 0을 할당
System.out.println(recur(x));
}
//재귀 메소드
static int recur(int x) {
if (dp[x] == null) {
//x가 6의 배수일 때
if (x % 6 == 0) {
dp[x] = Math.min(
recur(x - 1), Math.min(recur(x / 3), recur(x / 2))
) + 1;
}
//x가 3의 배수일 때
else if (x % 3 == 0) {
dp[x] = Math.min(recur(x / 3), recur(x - 1)) + 1;
}
//x가 2의 배수일 때
else if (x % 2 == 0) {
dp[x] = Math.min(recur(x / 2), recur(x - 1)) + 1;
}
//x가 2와 3의 배수가 아닐 때
else {
dp[x] = recur(x - 1) + 1;
}
}
return dp[x];
}
}
동적 계획법(DP; Dynamic Programming) 문제이다.
메모이제이션(Memoization)은 컴퓨터 프로그램이 동일한 계산을 반복적으로 해야 할 때,
이전에 계산한 값을 메모리에 저장하여 중복적인 계산을 제거하여
전체적인 실행 속도를 빠르게 해주는 기법으로 동적 계획법의 핵심이 되는 기술이다.