https://www.acmicpc.net/problem/4485
1. 아이디어
동굴의 각 칸에서 루피를 최소한으로 잃으면서 도착점으로 가야하는 문제로 사방탐색 + 다익스트라 알고리즘을 활용하면 간단하게 해결할 수 있다.
2. 문제풀이
다익스트라 알고리즘에서 거리 배열의 갱신에 동굴 정보를 적용하는 부분만 신경쓰면 무난히 해결할 수 있었다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
private static class Node implements Comparable<Node> {
int r;
int c;
int sum;
public Node(int r, int c, int sum) {
this.r = r;
this.c = c;
this.sum = sum;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.sum, o.sum);
}
}
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int testCase = 1;
while (true) {
int N = Integer.parseInt(br.readLine());
if (N == 0) break;
int[][] map = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int sum = dijkstra(N, map);
sb.append("Problem ").append(testCase).append(": ").append(sum).append("\n");
testCase++;
}
bw.write(sb.toString());
bw.flush();
}
private static int dijkstra(int N, int[][] map) {
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(0, 0, 0));
boolean[][] visited = new boolean[N][N];
int[][] dist = new int[N][N];
for (int i = 0; i < N; i++) {
Arrays.fill(dist[i], INF);
}
dist[0][0] = map[0][0];
while (!pq.isEmpty()) {
Node node = pq.remove();
if (node.r == N - 1 && node.c == N - 1) return node.sum;
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 >= N) continue;
if (visited[nr][nc]) continue;
if (dist[nr][nc] > dist[node.r][node.c] + map[nr][nc]) {
dist[nr][nc] = dist[node.r][node.c] + map[nr][nc];
pq.add(new Node(nr, nc, dist[nr][nc]));
}
}
}
return -1;
}
}
4. 후기
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 11404번 - 플로이드 [Java] (0) | 2025.02.02 |
---|---|
[백준] 11444번 - 피보나치 수 6 [Java] (0) | 2025.02.02 |
[백준] 11779번 - 최소비용 구하기 2 [Java] (0) | 2025.02.01 |
[백준] 1916번 - 최소비용 구하기 [Java] (0) | 2025.02.01 |
[백준] 1504번 - 특정한 최단 경로 [Java] (0) | 2025.02.01 |