백준/15001 - 20000

[백준] 17071번 : 숨바꼭질 5

lms0806 2024. 11. 10. 13:37
728x90
반응형

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

 

기존 숨바꼭질과 비슷한 문제입니다.

단, 동생은 현재 이동속에 부스터가 붙어 +1, 이전값 +2, 이전값 +3 이런식으로 이동거리가 증가됩니다.

수빈이가 동생을 만날 수 없고, 찾는 위치가 500,000을 넘는 경우에는 -1을 출력하면 됩니다.

 

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 Main {
	static int n, k;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());
		
		System.out.print(n == k ? 0 : bfs());
	}
	
	public static int bfs() {
		Queue<Integer> queue = new LinkedList<>();
		boolean[][] visited = new boolean[2][500001];
		queue.add(n);
		
		int move = 1;
		while(!queue.isEmpty()) {
			k += move;
			
			if(k > 500000) {
				return -1;
			}
			
			if(visited[move % 2][k]) {
				return move;
			}
			
			int size = queue.size();
			
			for(int i = 0; i < size; i++) {
				int x = queue.poll();
				
				for(int nx : new int[]{x + 1, x - 1, x << 1}) {
					if(nx == k) {
						return move;
					}
					
					if(nx < 0 || nx > 500000 || visited[move % 2][nx]) {
						continue;
					}
					visited[move % 2][nx]  = true;
					queue.add(nx);
				}
			}
			
			move++;
		}
		return -1;
	}
}
728x90
반응형