문제
https://www.acmicpc.net/problem/12851
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
풀이 과정
BFS를 떠올리기는 쉬웠는데 K까지 도달하는 개수를 어떻게 셀 지에 대해서 생각하기가 어려웠다.
방문체크를 q에서 꺼낼 때함으로써, 현재 step에서는 중복을 허용하되 다음 step에서는 이전에 방문한 것을 제외하고 방문하도록 할 수 있었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
boolean[] visited = new boolean[100001];
Queue<Integer> q = new LinkedList<>();
q.add(N);
int step = 0, cnt = 0;
while(!q.isEmpty()){
for(int i=0, size = q.size(); i<size; i++){
int now = q.poll();
visited[now] = true;
if(now == K){
cnt++;
continue;
}
if(now > 0 && !visited[now - 1]){
q.add(now - 1);
}
if(now + 1 <= 100_000 && !visited[now + 1]){
q.add(now + 1);
}
if(now * 2 <= 100_000 && !visited[now * 2]){
q.add(now * 2);
}
}
if(cnt > 0) break;
step++;
}
StringBuilder sb = new StringBuilder();
sb.append(step).append("\n").append(cnt);
System.out.println(sb);
}
}
결과
'코딩문제풀이 > Baekjoon' 카테고리의 다른 글
[Java] 백준 1309번 : 동물원 (0) | 2023.04.18 |
---|---|
[Java] 백준 11048번 : 이동하기 (0) | 2023.04.15 |
[Java] 백준 17070번 : 파이프 옮기기 1 (0) | 2023.04.07 |
[Java] 백준 2531번 : 회전 초밥 (0) | 2023.04.03 |
[Java] 백준 3109번 : 빵집* (0) | 2023.03.31 |