알고리즘 연습

[1463] 1로 만들기 - Java

밀깜 2022. 3. 8. 16:03

 

1. 문제

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

2. 풀이

 

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

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {

		// 1. Read X
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int X = Integer.parseInt(br.readLine());

		// 2. Calcualte minimum count

		int [] arr = new int[X + 1];
		arr[1] = 0;

		for(int i = 2; i <= X; i++) {

			if (i % 6 == 0){
				
				int compare =  Math.min(arr[i/2], arr[i/3]);
				arr[i] = Math.min(compare, arr[i - 1]) + 1;
			}
			
			else if(i % 3 == 0) {
				arr[i] = Math.min(arr[i/3], arr[i - 1]) + 1;
			}
			
			else if(i % 2 == 0) {
				arr[i] = Math.min(arr[i/2], arr[i - 1]) + 1;
			}
			
			else {
				arr[i] = arr[i - 1] + 1;
			}
		}

		// 3. Print result
		System.out.println(arr[X]);

	}
}

 

3. 배운점

- 3, 2 뿐만 아니라 6으로 나눠지는 경우(둘의 최소 공배수)도 고려해야 한다.

- 큰 수로 나누어 떨어진다고 해서 최솟값이라는 보장이 없다. 따라서 1을 빼주는 경우를 매 조건에서 검토해주어야 한다.

 

4. 개선할 점

 

 


풀이 오류 지적, 다른 접근법 공유, 그 밖에 질문 등 모든 의견을 환영합니다.