1. 💎 문제
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
2. 🤔어떻게 풀까
처음 봤을 때는 누적하면 풀어야될 것 같아서 DP로 풀어야하나 생각했다. 하지만 보다보니깐 큐를 이용해서 <거리, 시간> 정보를 넣어서 관리해주면 될 것 같았다. 현재 위치에서 이동할 수 있는 경우의 수는 -1, +1, *2로 3가지이다. 그러므로 이 3가지 위치에 대해만 생각하면 되며, 현재 노드를 거쳐서 다음 위치를 갈 때 비용이 적은 경우 => 비용 갱신 및 큐에 추가 하기로 했다.
이 과정을 큐가 빌 때까지 반복하며, K위치에 다 다를 경우는 여러 경우의 수가 있으므로, `Math.min`을 이용하여 최소값을 `ans`로 하였다.
3. 📄 전체코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_숨바꼭질3 {
static final int MAX = 100001;
static BufferedReader br;
static int N;
static Queue<Data> que;
static int ans =MAX;
public static void main(String [] args) throws Exception{
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());
int [] times = new int[MAX];
Arrays.fill(times, MAX);
que = new LinkedList<>();
que.add(new Data(N, 0));
times[N] = 0;
while(!que.isEmpty()){
Data curData = que.poll();
if(curData.pos == K){
ans = Math.min(curData.time, ans);
}
// -1칸
if(curData.pos >0 && times[curData.pos-1] > curData.time+1){
times[curData.pos-1] = curData.time+1;
que.add(new Data(curData.pos-1, curData.time +1));
}
// +1칸
if(curData.pos <MAX-1 && times[curData.pos+1] > curData.time+1){
times[curData.pos+1] = curData.time+1;
que.add(new Data(curData.pos+1, curData.time +1));
}
// *2칸
if(curData.pos*2 < MAX && times[curData.pos*2] > curData.time){
times[curData.pos*2] = curData.time;
que.add(new Data(curData.pos*2, curData.time));
}
}
System.out.println(ans);
}
}
class Data{
int pos;
int time;
public Data(int pos, int time){
this.pos = pos;
this.time = time;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] IF문 좀 대신 써줘 : 19637 : JAVA - 이분탐색 (S3) (0) | 2023.11.10 |
---|---|
[D2] 파스칼의 삼각형 (0) | 2023.11.09 |
[G5] 가장 긴 짝수 연속한 부분 수열 : 22862 : Java - 투 포인터 (0) | 2023.11.05 |
[G4] 인구이동 : 16234 : Java - BFS, 구현 (1) | 2023.11.04 |
[S1] 쉬운 최단거리 : 14940 : Java - BFS (1) | 2023.11.04 |