Problem Solving/Baekjoon

[백준] 1697 숨바꼭질 - Graph Theory / Java

graycode 2022. 6. 11. 22:27

 문제 링크

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

 풀이 과정

너비 우선 탐색을 수행할 함수를 정의, 현재 위치(n) 와 도착 위치(k) 를 매개변수로 받고 큐에 현재 위치를 저장한다.

그리고 방문 여부를 확인할 chk 배열을 문제에 제시된 조건에 의해 100,001의  크기로 생성, 현재 위치를 1로 표시한다.

 

현재 위치는 loc 변수에, 다음으로 이동할 위치를 move 변수에 설정하며

3가지 이동 방법 (n + 1, n - 1, n * 2) 으로 이동한 모든 경우를 탐색하여 다음 이동할 위치가 지정된다.

 

다음 이동할 위치가 이동 가능한 범위를 벗어나지 않고 방문한 적이 없다면 큐에 넣어 현재 위치를 갱신한다.

만약 이동할 위치가 도착 위치, 즉 k 와 같다면 그대로 반복문을 빠져나와 결과 값으로써 반환한다.

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		if (n == k)
			bw.write(0 + "\n");
		else
			bw.write(bfs(n, k) + "\n");

		bw.flush();
	}

	private static int bfs(int n, int k) {
		Queue<Integer> q = new LinkedList<>();
		q.offer(n);

		int[] chk = new int[100001];
		chk[n] = 1;
		
		int result = 0;
		loop:
		while (!q.isEmpty()) {
			int loc = q.poll();
			for (int i = 0; i < 3; i++) {
				int move;

				if (i == 0)
					move = loc + 1;
				else if (i == 1)
					move = loc - 1;
				else
					move = loc * 2;

				if (move == k) {
					result = chk[loc];
					break loop;
				}

				if (move >= 0 && move < chk.length && chk[move] == 0) {
					q.offer(move);
					chk[move] = chk[loc] + 1;
				}
			}
		}

		return result;
	}

}