Java

[백준 1697] 숨바꼭질 (JAVA)

iheeeee6-6 2023. 2. 8. 17:24
728x90

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

bfs를 이용하여 문제를 해결할 수 있었다.

일차원 배열을 생성하여 index번호에 도달할 수 있는 시간을 저장한다.

따라서 예시에서 수빈이의 위치는 5이고, 동생의 위치는 17이다.

그럼 dp[5]는 0초이다. 그러나 계산하기 쉽게 1로 세팅해준다.

그리고 dp[5-1] , dp[5+1], dp[5*2] 는 1초이다. 계산하기 쉽도록 dp[5]+1을 한다.

만약, 이미 값이 있는 index라면 값을 변경하지 않는다.

 

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[] dp = new int[100001];
	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());
		bfs(n);
	}

	static void bfs(int n) {
		Queue<Integer> q = new LinkedList<>();
		q.add(n);
		dp[n] = 1;
		while (!q.isEmpty()) {
			int idx = q.poll();
			if(idx==k) {
				System.out.println(dp[idx]-1);
				return;
			}
			if (idx - 1 >= 0 && dp[idx - 1] == 0) {
				dp[idx - 1] = dp[idx] + 1;
				q.add(idx - 1);
			}
			if (idx + 1 <= 100000 && dp[idx + 1] == 0) {
				dp[idx + 1] = dp[idx] + 1;
				q.add(idx + 1);
			}
			if (idx * 2 <= 100000 && dp[idx * 2] == 0) {
				dp[idx * 2] = dp[idx] + 1;
				q.add(idx * 2);
			}
		}
	}
}

 

'Java' 카테고리의 다른 글

[백준 1021] 회전하는 큐 (JAVA)  (0) 2023.02.10
[백준 1699] 제곱수의 합 (JAVA)  (0) 2023.02.08
[백준 1309] 동물원 (JAVA)  (0) 2023.02.08
[백준 2293] 동전1 (JAVA)  (0) 2023.02.07
[백준 2133] 타일 채우기 (JAVA)  (0) 2023.02.05