SWEA_D4_1249
๐ [D4_1249] ๋ณด๊ธ๋ก
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
public class Solution {
static int N;
static int[][] map;
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
static int minCost;
static int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// ํ
์คํธ์ผ์ด์ค
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
sb.append("#").append(tc).append(" ");
// ์ง๋์ ํฌ๊ธฐ
N = Integer.parseInt(br.readLine());
// ๊ฐ ์ ์ฅ ๋ฐฐ์ด
map = new int[N][N];
// ์
๋ ฅ
for (int i = 0; i < N; i++) {
String str = br.readLine();
String[] sstr = str.split("");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(sstr[j]);
}
}
sb.append(dijkstra(0,0)).append("\n");
}
System.out.println(sb);
}
// ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
static int dijkstra(int startR, int startC) {
// ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ฐฐ์ด
boolean[][] visited = new boolean[N][N];
// ์ถ๋ฐ์ง์์ ์์ ๊น์ง์ ์ต์๋ณต๊ตฌ์๊ฐ
int[][] minTime = new int[N][N];
// ๋ชจ๋ ๋ฐฐ์ด๊ฐ์ max ๊ฐ์ผ๋ก ์ค์ ( ์ด๊ธฐํ )
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
minTime[i][j] = INF;
}
}
// int[] = ์ ์ ์ ๋ณด, ์ถ๋ฐ์ง์์ ์์ ๊น์ง์ ๋น์ฉ r,c,cost
PriorityQueue<int[]> pQueue = new PriorityQueue<int[]>(new Comparator<int[]>() {
// cost ๋น๊ต
@Override
public int compare(int[] o1, int[] o2) {
return o1[2] - o2[2];
}
});
minTime[startR][startC] = 0;
pQueue.offer(new int[] { startR, startC, minTime[startR][startC] });
// BFS
int r, c, minCost, nr, nc, current[];
while (true) {
// ๋์ฐฉ์ง๋ผ๋ฉด ๋๋ด๊ธฐ
if (r == N - 1 && c == N - 1)
return minCost;
// pQueue ์์ ์ ์ ์ค ์ถ๋ฐ์ง์์ ์์ ์ผ๋ก์ ๋น์ฉ์ด ์ต์์ธ ์ ์ ์ ์ ๋ณด
current = pQueue.poll();
r = current[0];
c = current[1];
minCost = current[2];
// ๋ฐฉ๋ฌธํ ๊ณณ์ด๋ผ๋ฉด ํต๊ณผ
if (visited[r][c])
continue;
// ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[r][c] = true;
// ํ ์ ์ ์ ์ธ์ ์ ์ ๋ค์ฌ๋ค๋ณด๋ฉฐ ์ต์๋น์ฉ ๊ฐฑ์
for (int i = 0; i < 4; i++) {
nr = r + dr[i];
nc = c + dc[i];
if (nr >= 0 && nr < N && nc >= 0 && nc < N && minTime[nr][nc] > minCost + map[nr][nc]) {
minTime[nr][nc] = minCost + map[nr][nc];
pQueue.offer(new int[] { nr, nc, minTime[nr][nc] });
}
}
}
}
}
๐ค ๋์ ์๊ฐ
์ด ๋ฌธ์ ๋ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ ๋ฌธ์ ์ด๋ค.
๋ณดํต ๊ฐ์ค์น๊ฐ ์๋ ์ต์๋น์ฉ์ ๋์ฐฉ์ง์ ์ค๋ฉด ๋์ด๊ธฐ ๋๋ฌธ์ BFS๋ก ํด๊ฒฐํ๊ณ ๊ฐ์ค์น๊ฐ ์๋ ์ต์๋น์ฉ์ BFS๋ก ๊ตฌํํ๋ค๋ฉด ๋ฐฉ๋ฌธ์ฒดํฌ๋ ์ต์๊ฐ์ ๊ฐฑ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ด ๋ฌธ์ ๋ ๋จ์ผ ์ถ๋ฐ์ง์์ ๋ค๋ฅธ ๋์ฐฉ์ง๋ก ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ์ต์๋น์ฉ์ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ์ ์ ํ๋ค !!
๊ฐ์ ์ 4๋ฐฉํฅ์ผ๋ก ๊ฐ ์ ์๊ณ ๊ฐ์ค์น๋ ๊น์ด์ด๋ค.
๋จผ์ ์ต์๋ณต๊ตฌ์๊ฐ์ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์์ฑํ ๋ค max ๊ฐ์ผ๋ก ์ด๊ธฐํ ์ํจ๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ๋ถํฐ 0์ ์ง์ด๋ฃ๊ณ ๋ค์ ๊ฐ๋ค์ ์ต์๋น์ฉ์ ๊ฐฑ์ ํ๋ฉด์ ๋์ ์ ๋๋ฌํ ๋๊น์ง ์งํํ๋ค.
๊ทธ๋ฌ๋ฉด ์ฐ์ ์์ ํ์ ์ํด ํ ๋ด๋ถ์ ์ ๋ ฌ์ด ๋์ด์ ์ต์๋น์ฉ์ด ๋์ค๊ฒ ๋๋ค.