2 ๋ถ„ ์†Œ์š”

๐Ÿ“ [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์„ ์ง‘์–ด๋„ฃ๊ณ  ๋‹ค์Œ ๊ฐ’๋“ค์˜ ์ตœ์†Œ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•˜๋ฉด์„œ ๋์ ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์šฐ์„ ์ˆœ์œ„ ํ์— ์˜ํ•ด ํ ๋‚ด๋ถ€์— ์ •๋ ฌ์ด ๋˜์–ด์„œ ์ตœ์†Œ๋น„์šฉ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.