본문 바로가기
코딩테스트 준비/JAVA 코테

백준 1697. 숨바꼭질

by 김긍수 2021. 3. 22.

www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

문제제목 : 숨바꼭질

문제유형 : BFS

문제난이도 : 실버1

 

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 

아이디어

- 특정 위치까지 이동하는 최단 시간을 계산하는 문제이다.

- 이동시간이 모두 1초이므로 너비우선탐백을 이용하여 해결.

- 큐를 구현함. (BFS이므로)

 

@ 5에서 7로 가는 최단거리

코드

package week4;

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;

/*
 * 숨바꼭질 https://www.acmicpc.net/problem/1697
 * 문제유형 : BFS
 * 
 */

public class BOJ1697 {
	private static int MAX = 100001;
	private static int n, k;
	private static int[] data = new int[MAX]; // 최대 100,000

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String[] input = br.readLine().split(" ");
		
		n = Integer.valueOf(input[0]);
		k = Integer.valueOf(input[1]);
		
		BFS(n);
		
		bw.write(String.valueOf(data[k]));
		bw.flush();
		bw.close();
	}
	
	public static void BFS(int start) {
		Queue<Integer> queue = new LinkedList<>();
		queue.add(start);
		
		while (!queue.isEmpty()) { // 큐가 비어있으면 종료
			int num = queue.poll();
			
			if (num == k) { // 술래잡기 성공 시 카운트 출력
				return;
			}
			
			int next = num - 1;
			if (0 <= next && next < MAX && data[next] == 0) {
				data[next] = data[num] + 1;
				queue.add(next);
			}
			next = num + 1;
			if (0 <= next && next < MAX && data[next] == 0) {
				data[next] = data[num] + 1;
				queue.add(next);
			}
			
			next = num * 2;
			if (0 <= next && next < MAX && data[next] == 0) {
				data[next] = data[num] + 1;
				queue.add(next);
			}
		}
	}

}

'코딩테스트 준비 > JAVA 코테' 카테고리의 다른 글

백준1325. 효율적인 해킹 DFS, BFS  (0) 2021.03.24
백준1012. 유기농배추 DFS, BFS  (0) 2021.03.23
백준 2606. 바이러스  (0) 2021.03.22
백준 2164. 카드2  (0) 2021.03.08
백준 11047. 동전 0  (0) 2021.03.08

댓글