SSONG Cloud

[백준] 1697. 숨바꼭질 본문

Algorithm/백준

[백준] 1697. 숨바꼭질

SSONGMI 2021. 3. 1. 19:21
반응형

문제 출처: www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

: 수빈이와 동생이 숨바꼭질을 하는데 수빈이가 동생을 찾는데 걸리는 가장 빠른 시간을 구해야한다.

: 수빈이의 위치 N과 동생의 위치 K가 입력으로 주어진다.

: 수빈이는 -1, +1, *2 해서 1초마다 움직일 수 있다.

: bfs 방식으로 접근할 수 있고,

: 델타탐색을 하기 위해 수빈이의 위치가 바뀔때마다 배열의 *2 자리를 갱신해 주었다.

: 탐색하던 중 K와 동일해지면 함수를 멈추고 걸린 시간을 반환해 준다.

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 숨바꼭질1697 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static int N, K;
	static int[] dr = new int[3];
	static boolean[] visited = new boolean[100001];
	public static void main(String[] args) throws IOException {
		// 수빈이의 위치 N과 동생의 위치 K를 입력받고
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		dr[0] = -1; dr[1] = 1; dr[2] = N;
		// bfs 방식으로 접근
		int ans = bfs(N);
		System.out.println(ans);
	}
	
	private static int bfs(int n) {
		Queue<int[]> q = new LinkedList<>();
		q.offer(new int[] {n, 0});
		visited[n] = true;
		
		while(!q.isEmpty()) {
			int[] temp = q.poll();
			int location = temp[0];
			if(location == K) return temp[1];
			dr[2] = location;
			for(int i = 0; i < 3; i++) {
				int nr = location + dr[i];
				if(nr < 0 || nr >= 100001 || visited[nr]) continue;
				visited[nr] = true;
				q.offer(new int[] {nr, temp[1]+1});
			}
		}
		return -1;
	}
	
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 10026 적록색약  (0) 2021.03.15
[백준] 1927 최소 힙  (0) 2021.03.10
[백준] 1744 수 묶기  (0) 2021.03.10
[백준] 7576 토마토  (0) 2021.03.01
[백준] 11047. 동전0  (0) 2021.02.28
Comments