https://www.acmicpc.net/problem/1463
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다.
연산을 사용하는 횟수의 최솟값을 출력하시오.
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
N+1개의 정수를 저장할 수 있는 배열을 사용했다.
배열에는 각 인덱스(정수)를 1로 만들기 위해, 필요한 연산 횟수의 최솟값이 저장된다.1부터 N-1까지 배열을 순회하며, 각 인덱스와 세 가지의 연산을 통해 새로운 인덱스 3개의 값을 얻는다.
새로운 인덱스값으로 배열에 접근해 해당 값을 최신화 한다.
이때, 이전에 값이 수정된 적이 있다면, 최솟값으로 설정한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N+1];
for(int i=1; i<N; i++){
int plus = arr[i]+1;
if(i+1<=N && (arr[i+1]==0 || arr[i+1]>plus)){
arr[i+1] = plus;
}
if(i*2<=N && (arr[i*2]==0 || arr[i*2]>plus)){
arr[i*2] = plus;
}
if(i*3<=N && (arr[i*3]==0 || arr[i*3]>plus)){
arr[i*3] = plus;
}
}
System.out.println(arr[N]);
}
}