알고리즘
[백준] | JAVA, 자바 | 1463번 - 1로 만들기
inttype
2025. 2. 2. 21:30
https://www.acmicpc.net/problem/1463
문제 요약 :
1. 정수 X 입력받기
2. 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지이다.
2-1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
2-2. X가 2로 나누어 떨어지면, 2로 나눈다.
2-3. 1을 뺀다.
3. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다.
4. 연산을 사용하는 횟수의 최솟값을 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//1. 정수 X 입력받기
int n = Integer.parseInt(br.readLine());
boolean[] visited = new boolean[n + 1];
Queue<Integer> queue = new ArrayDeque<>();
queue.add(n);
visited[n] = true;
int cnt = 0;
//2. 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지이다.
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int temp = queue.poll();
//3. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다.
if (temp == 1) {
System.out.println(cnt);
return;
}
//2-1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
if (temp % 3 == 0 && !visited[temp / 3]) {
visited[temp / 3] = true;
queue.add(temp / 3);
}
//2-2. X가 2로 나누어 떨어지면, 2로 나눈다.
if (temp % 2 == 0 && !visited[temp / 2]) {
visited[temp / 2] = true;
queue.add(temp / 2);
}
//2-3. 1을 뺀다.
if (temp - 1 >= 1 && !visited[temp - 1]) {
visited[temp - 1] = true;
queue.add(temp - 1);
}
}
cnt++;
}
//4. 연산을 사용하는 횟수의 최솟값을 출력
System.out.println(cnt);
}
}