티스토리 뷰

728x90
 

1463번: 1로 만들기

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

www.acmicpc.net

 

문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

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

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

 

 

 

예전에 풀었던 1697번과 아주 유사한 문제다. 만약 N이 6일 경우 갈 수 있는 경로가 3, 2, 5이고, 갈 수 있는 모든 경로를 방문 여부를 나타내는 배열에 1씩 더하면 된다. 최소 경로를 찾기 위해 BFS 알고리즘을 사용하여 이미 방문한 경로에는 새로운 값을 대입하지 않도록 했다. 처음엔 최소 경로를 찾는 것과 방문한 경로에는 새로운 값을 대입하지 않는게 무슨 연관인지 이해가 잘 안갔는데, 큐는 선입선출이기 때문에 무조건 먼저 방문한 경로가 최솟값을 가진다.

package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;

public class B_1463 {
	static int[] visited;
	static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		visited = new int[N + 1];
		if(N == 1) System.out.println(0);
		else BFS();
	}
	static void BFS() {
		Queue<Integer> q = new LinkedList<Integer>();
		q.offer(N);
		visited[N] = 1;
		
		while(!q.isEmpty()) {
			int temp = q.poll();
			for(int i=0;i<3;i++) {
				int next;
				if(i == 0 && temp % 3 == 0)
					next = temp / 3;
				else if(i == 1 && temp % 2 == 0)
					next = temp / 2;
				else
					next = temp - 1;
				
				if(next == 1) {
					System.out.println(visited[temp]);
					return;
				}
				if(next > 0 && next < visited.length && visited[next] == 0) {
					q.offer(next);
					visited[next] = visited[temp] + 1;
				}
			}
		}
	}
}

]

 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함