[백준(Baekjoon)][자바(java)] 1697 : 숨바꼭질 / 그래프와 순회

728x90

 

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

문제 풀이

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

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

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken()),
			k = Integer.parseInt(st.nextToken());
		br.close();

		final int max = 100001;
		int answer = 0, i, pos, time, pos_next[], p, time_next, dot[];

		Deque<int[]> queue = new ArrayDeque<>(); // position, time
		queue.add(new int[]{n, 0});

		boolean v[] = new boolean[max];
		v[n] = true;

		loop : 
		while (!queue.isEmpty()) {
			dot = queue.remove();
			pos = dot[0];
			time = dot[1];
			pos_next = new int[]{pos * 2, pos + 1, pos - 1};
			time_next = time + 1;
			for (i = 0; i < 3; i++) {
				p = pos_next[i];
				if (p < 0 || p >= max || v[p])
					continue;
				if (p == k) {
					answer = time_next;
					break loop;
				}
				queue.add(new int[]{p, time_next});
				v[p] = true;
			}
		}

		System.out.println(answer);
	}
}

 

반응형