알고리즘/백준

[백준] 1463번 - 1로 만들기

땀두 2022. 3. 20. 12:28

 

dp문제이다. 점화식을 세우기는 간단했지만 10 같은 경우는 10 -> 5-> 4 -> 2-> 1보다 10 -> 9 -> 3 -> 1 이 더 최적의 수라고 할 수 있다. 따라서 Math.min을 이용하여 각자의 값 중 작은 값들을 배열에 저장하여 그 값을 출력하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class p1463 {
	public static Integer[] ary;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int a = Integer.parseInt(br.readLine());

		ary = new Integer[a + 1];

		ary[0] = 0;
		ary[1] = 1;
		System.out.println(func(a));
	}

	public static int func(int a) {
		if(ary[a] == null) {			
			if (a % 6 == 0) {
				ary[a] = Math.min(func(a / 3), Math.min(func(a / 2), func(a - 1))) + 1;
			} else if (a % 3 == 0) {
				ary[a] = Math.min(func(a / 3), func(a - 1)) + 1;
			} else if (a % 2 == 0) {
				ary[a] = Math.min(func(a / 2), func(a - 1)) + 1;
			} else {
				ary[a] = func(a - 1) + 1;
			}
		}
		return ary[a];
	}
}
 

 

점화식을 세우는 부분이 아직 미숙해서 2와 3의 최소 공배수인 6으로 나누어지는 경우를 찾지 못해 답을 제대로 못구하고, 블로그를 참고했는데 조금 더 익숙해져야 할 것 같다.