[BOJ 1697] 숨바꼭질 (java)

1 minute read

:pencil2: 문제 링크 https://www.acmicpc.net/problem/1697:pencil2:

문제풀이

package basics_600;

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

public class BOJ1697 {
	static int count = 0;
	static boolean[] visited;
	static int MAX = 100000;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		// 수빈이 위치
		int N = Integer.parseInt(st.nextToken());
		// 동생 위치
		int K = Integer.parseInt(st.nextToken());
		// 방문 여부
		visited = new boolean[MAX+1];

		bfs(N,K);

	}

	static void bfs(int N, int K) {
		Queue<Integer> queue = new LinkedList<Integer>();
		// 루트 노드 방문
		visited[N] = true;
		// 큐에 넣기
		queue.offer(N);

		//큐 방문 
		while (!queue.isEmpty()) {
			//노드의 갯수만큼 
			int size = queue.size();
			
			for (int i = 0; i < size; i++) {
				//수빈이 위치 x
				int num = queue.peek();
				// x-1 이동 
				int back = queue.peek()-1;
				// x+1 이동 
				int front = queue.peek()+1;
				// x*2 이동 
				int jump = queue.peek()*2;
				
				queue.poll();
				
				//동생위치와 같다면 출력하고 루프 빠져나오기 
				if (num == K) {
					System.out.println(count);
					queue.clear();
					break;
				}
				
				//방문한적 없고 이동할 수 있는 위치라면 이동 
				if (back >= 0 && !visited[back]) {
					visited[back] = true;
					queue.offer(back);

				}
				if (front <= MAX && !visited[front]) {
					visited[front] = true;
					queue.offer(front);

				}
				if (jump <= MAX && !visited[jump]) {
					visited[jump] = true;
					queue.offer(jump);
				}
			}
			//depth 증가 
			count++;
		}

	}

}

Comments