13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
풀이
BFS를 사용하여 시작 위치에서 도착 위치까지 가는 최소 시간을 구한다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
System.out.println(bfs(start, end));
}
static int bfs(int start, int end) {
Queue<Integer> q = new LinkedList<>();
q.add(start);
int[] dis = new int[100001];
Arrays.fill(dis, Integer.MAX_VALUE);
dis[start] = 0;
while (!q.isEmpty()) {
int pos = q.poll();
if (pos == end)
return dis[end];
if (checkIndex(pos + 1) && (dis[pos+1] > dis[pos] + 1)) {
dis[pos+1] = dis[pos] + 1;
q.add(pos+1);
}
if (checkIndex(pos - 1) && dis[pos-1] > dis[pos] + 1) {
dis[pos-1] = dis[pos] + 1;
q.add(pos-1);
}
if (checkIndex(pos * 2) && dis[pos*2] > dis[pos]) {
dis[pos * 2] = dis[pos];
q.add(pos*2);
}
}
return -1;
}
static boolean checkIndex(int n) {
if (n >= 0 && n <= 100000)
return true;
return false;
}
}
다른 풀이 - 2
Queue에 (위치, 시간)을 저장하고, visited를 사용해 방문 여부를 체크한다.
이 때 Queue에 넣는 순서를 *2 -> -1 -> 1 순서로 해야 한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
System.out.println(bfs(start, end));
}
static int bfs(int start, int end) {
Queue<int[]> q = new LinkedList<>();
q.add(new int[]{start, 0});
boolean[] visited = new boolean[100001];
visited[start] = true;
while (!q.isEmpty()) {
int[] cur = q.poll();
int pos = cur[0];
int sec = cur[1];
if(pos == end) {
return sec;
}
if (checkIndex(pos * 2) && !visited[pos*2]) {
visited[pos*2] = true;
q.add(new int[]{pos*2, sec});
}
if (checkIndex(pos - 1) && !visited[pos-1]) {
visited[pos-1] = true;
q.add(new int[]{pos-1, sec + 1});
}
if (checkIndex(pos + 1) && !visited[pos+1]) {
visited[pos+1] = true;
q.add(new int[]{pos+1, sec + 1});
}
}
return -1;
}
static boolean checkIndex(int n) {
if (n >= 0 && n <= 100000)
return true;
return false;
}
}
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 11725번 : 트리의 부모 찾기 - 자바[Java] (0) | 2022.11.20 |
---|---|
[백준] 1197번 : 최소 스패닝 트리(MST) - 자바[Java] (0) | 2022.11.19 |
[백준] 1504번 : 특정한 최단 경로 - 자바[Java] (0) | 2022.11.19 |
[백준] 1753번 : 최단경로(다익스트라) - 자바[Java] (0) | 2022.11.19 |
[백준] 10816번 : 숫자 카드 2 - 자바[Java] (0) | 2022.11.17 |