PS/Java
[백준] 1463. 1로 만들기
siyamaki
2022. 3. 29. 11:24
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
예제 입력 2
10
예제 출력 2
3
10의 경우에 10 -> 9 -> 3 -> 1 로 3번 만에 만들 수 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[] arr = new int[num + 1];
arr[1] = 0;
int a = 2;
while(a <= num) {
int minusOne;
int divideTwo = Integer.MAX_VALUE;
int divideThree = Integer.MAX_VALUE;
if(a % 2 == 0) { // 2로 나누어 떨어질 때
divideTwo = arr[a / 2] + 1;
}
if(a % 3 == 0) { // 3으로 나누어 떨어질 때
divideThree = arr[a / 3] + 1;
}
minusOne = arr[a - 1] + 1;
int res = Math.min(minusOne, Math.min(divideThree, divideTwo));
arr[a] = res;
a++;
}
System.out.println(arr[num]);
}
}
DP배열을 이용한다.
2로 나누어떨어지면 이전값은 2의 배수였으니 a / 2값에 1을 더한다
3으로 나누어떨어지면 이전값은 3의 배수였으니 a / 3값에 1을 더한다
-1은 항상 할수 있으니 조건에 포함시키지 않고 매번 실행한다.
a의 크기를 num까지 증가시키면서 -1, /2, /3을 실행한 count 값중 최소값을 항상 저장하면서 arr[num]의 값을 출력하면 된다.