https://www.acmicpc.net/problem/14497
1. 아이디어
다익스트라 알고리즘 또는 0-1 BFS 알고리즘으로 해결할 수 있다.
2. 문제풀이
(x1, y1)에서 (x2, y2)까지 최소한의 점프 횟수로 도달해야하는 문제로 점프 한번에 한 겹의 친구 벽을 없앨 수 있으므로 이를 가중치가 1인 간선으로 이동이라고 생각하면 최단 경로를 구하는 다익스트라 알고리즘으로 풀이할 수 있다. 빈공간은 가중치가 0인 간선으로 생각하면 가중치가 0, 1 두가지로 이루어진 상황이므로 0-1 BFS 알고리즘으로도 해결할 수 있다. 두 가지 모두 간단한 구현만 하면 해결할 수 있다.
3. 코드
import java.io.*;
import java.util.*;
public class Main_BFS01 {
private static class Node {
int r;
int c;
public Node(int r, int c) {
this.r = r;
this.c = c;
}
}
private static final int[] dr = {-1, 0, 1, 0};
private static final int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken()) - 1;
int y1 = Integer.parseInt(st.nextToken()) - 1;
int x2 = Integer.parseInt(st.nextToken()) - 1;
int y2 = Integer.parseInt(st.nextToken()) - 1;
char[][] map = new char[N][M];
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
}
int jump = zero_one_bfs(x1, y1, x2, y2, N, M, map);
System.out.println(jump);
}
// 0-1 BFS 알고리즘
private static int zero_one_bfs(int x1, int y1, int x2, int y2, int N, int M, char[][] map) {
Deque<Node> dq = new ArrayDeque<>();
dq.add(new Node(x1, y1));
boolean[][] visited = new boolean[N][M];
visited[x1][y1] = true;
int dist = 0;
while (!dq.isEmpty()) {
int len = dq.size();
for (int i = 0; i < len; i++) {
Node node = dq.removeFirst();
if (node.r == x2 && node.c == y2) return dist;
for (int dir = 0; dir < 4; dir++) {
int nr = node.r + dr[dir];
int nc = node.c + dc[dir];
if (nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
if (visited[nr][nc]) continue;
if (map[nr][nc] == '0') {
dq.addFirst(new Node(nr, nc));
visited[nr][nc] = true;
i--;
} else {
dq.addLast(new Node(nr, nc));
visited[nr][nc] = true;
}
}
}
dist++;
}
return -1;
}
}
import java.io.*;
import java.util.*;
public class Main_Dijkstra {
private static class Node implements Comparable<Node> {
int r;
int c;
int cnt;
public Node(int r, int c, int cnt) {
this.r = r;
this.c = c;
this.cnt = cnt;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.cnt, o.cnt);
}
}
private static final int INF = 1_000_000_000;
private static final int[] dr = {-1, 0, 1, 0};
private static final int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken()) - 1;
int y1 = Integer.parseInt(st.nextToken()) - 1;
int x2 = Integer.parseInt(st.nextToken()) - 1;
int y2 = Integer.parseInt(st.nextToken()) - 1;
char[][] map = new char[N][M];
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
}
int jump = dijkstra(x1, y1, x2, y2, N, M, map);
System.out.println(jump);
}
// 다익스트라 알고리즘
private static int dijkstra(int x1, int y1, int x2, int y2, int N, int M, char[][] map) {
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(x1, y1, 0));
boolean[][] visited = new boolean[N][M];
int[][] dist = new int[N][M];
for (int i = 0; i < N; i++) {
Arrays.fill(dist[i], INF);
}
dist[x1][y1] = 0;
while (!pq.isEmpty()) {
Node node = pq.remove();
if (node.r == x2 && node.c == y2) return node.cnt;
if (visited[node.r][node.c]) continue;
visited[node.r][node.c] = true;
for (int dir = 0; dir < 4; dir++) {
int nr = node.r + dr[dir];
int nc = node.c + dc[dir];
if (nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
if (visited[nr][nc]) continue;
if (map[nr][nc] == '0') {
if (dist[nr][nc] > dist[node.r][node.c]) {
dist[nr][nc] = dist[node.r][node.c];
pq.add(new Node(nr, nc, dist[nr][nc]));
}
} else {
if (dist[nr][nc] > dist[node.r][node.c] + 1) {
dist[nr][nc] = dist[node.r][node.c] + 1;
pq.add(new Node(nr, nc, dist[nr][nc]));
}
}
}
}
return -1;
}
}
4. 후기
- 0-1 BFS 알고리즘
- 다익스트라 알고리즘
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 11365번 - !밀비 급일 [Java] (0) | 2025.02.01 |
---|---|
[백준] 14226번 - 이모티콘 [Java] (0) | 2025.02.01 |
[백준] 2665번 - 미로만들기 [Java] (0) | 2025.02.01 |
[백준] 1261번 - 알고스팟 [Java] (0) | 2025.02.01 |
[백준] 1254번 - 팰린드롬 만들기 [Java] (0) | 2025.02.01 |