[백준 17071 : JAVA] 숨바꼭질 5 / BFS
문제
풀이
아래 그림을 보자.
현재 위치한 자리가 10이라고 가정할 때, 10 - 9 - 10 처럼 2초를 주기로 원래 자리로 돌아올 수 있다.
동생이 15초에 방문할 자리가 Y라고 했을 때, 수빈이가 그 위치를 3초가 되던 때에 방문한 적이 있다면 2초를 주기로 그 위치로 돌아올 수 있기 때문에 15초에도 그 자리에 위치해 있을 수 있다.
따라서, 수빈이가 방문한 위치의 시간이 홀수 시간인지 짝수시간인지를 구별해서 방문여부를 저장한다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static int n, k;
private static int[][] visit = new int[2][500001];
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
Arrays.fill(visit[0], -1);
Arrays.fill(visit[1], -1);
visit[0][n] = 0;
System.out.println((n == k) ? 0 : solution());
}
private static int solution() {
Queue<Integer> queue = new LinkedList<>();
queue.add(n);
int len, mod, time = 0;
while (!queue.isEmpty()) {
len = queue.size();
time++;
mod = time % 2; // 홀수, 짝수 판단
for (int i = 0; i < len; i++) {
int sb = queue.poll();
if (sb - 1 >= 0 && visit[mod][sb - 1] == -1) {
queue.add(sb - 1);
visit[mod][sb - 1] = time;
}
if (sb + 1 <= 500000 && visit[mod][sb + 1] == -1) {
queue.add(sb + 1);
visit[mod][sb + 1] = time;
}
if (sb * 2 <= 500000 && visit[mod][sb * 2] == -1) {
queue.add(sb * 2);
visit[mod][sb * 2] = time;
}
}
int bro = getBro(time); // 동생의 위치
if (bro > 500000) break; // 동생이 500000보다 넘어간다면 -1
if (visit[mod][bro] != -1) return time; // 동생의 위치에 형이 있다면 time 반환
}
return -1;
}
private static int getBro(int n) {
return k + (n * (n + 1) / 2);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 1238 : JAVA] 파티 / 다익스트라 (0) | 2020.10.22 |
---|---|
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS (0) | 2020.10.18 |
[백준 13913 : JAVA] 숨바꼭질 4 / BFS (0) | 2020.09.30 |
[백준 17141 : JAVA] 연구소 2 / BFS + 조합 (0) | 2020.09.27 |
[백준 9466 : JAVA] 텀 프로젝트 / DFS (0) | 2020.09.23 |
댓글
이 글 공유하기
다른 글
-
[백준 1238 : JAVA] 파티 / 다익스트라
[백준 1238 : JAVA] 파티 / 다익스트라
2020.10.22 -
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS
2020.10.18 -
[백준 13913 : JAVA] 숨바꼭질 4 / BFS
[백준 13913 : JAVA] 숨바꼭질 4 / BFS
2020.09.30 -
[백준 17141 : JAVA] 연구소 2 / BFS + 조합
[백준 17141 : JAVA] 연구소 2 / BFS + 조합
2020.09.27