3341 - Find Minimum Time to Reach Last Room I
정보
- 문제 보기: 3341 - Find Minimum Time to Reach Last Room I
- 소요 시간: 17분 41초
- 풀이 언어:
java - 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
다익스트라
풀이 코드
정보
- 메모리: 45000 KB
- 시간: 11 ms
import java.util.*;
class Solution {
int n, m;
int[][] minTime;
int[] dy = {-1, 0, 0, 1};
int[] dx = {0, -1, 1, 0};
public int minTimeToReach(int[][] moveTime) {
this.n = moveTime.length;
this.m = moveTime[0].length;
minTime = new int[n][m];
for (int[] line : minTime) Arrays.fill(line, Integer.MAX_VALUE);
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[2]));
pq.add(new int[]{0, 0, 0});
minTime[0][0] = 0;
while (!pq.isEmpty()) {
int[] e = pq.poll();
int y = e[0];
int x = e[1];
int t = e[2];
for (int d = 0; d < 4; ++d) {
int ny = y + dy[d];
int nx = x + dx[d];
if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue; // out of bound
int nt = Math.max(t+1, moveTime[ny][nx]+1);
if (minTime[ny][nx] <= nt) continue; // better one exists -> drop this
minTime[ny][nx] = nt;
pq.add(new int[]{ny, nx, nt});
}
}
return minTime[n-1][m-1];
}
}
풀이 해설
각 칸별 입장 시간의 제약조건을 가중치로 치환하여 생각하면 되고,
가중치 그래프에서의 최단 경로는 다익스트라로 찾는다.
노트
왜 BFS 안됨?
릿코 댓글에 하도 bfs 안된다거리길래 아예 안먹히나 싶은데 생각해보니 그냥 덜 효율적일 뿐 가능은 할 것 같은데?
우선순위 큐로 작은 시간에 도달한 경우부터 처리하는 이유는, 그 경우가 다음 이동 지점에 타 경로보다 더 작은 시간으로 도달할 확률이 높기 때문이고
더 작은 시간 값을 minTime 배열에 먼저 기록해뒀을수록 drop 기준이 빡세지니 탐색 수가 줄어들기 때문이다.