📖 오늘의 학습 키워드
힙 (다익스트라)
[Minimum Time to Visit Disappearing Nodes]
https://leetcode.com/problems/minimum-time-to-visit-disappearing-nodes/description/
class Solution {
public int[] minimumTime(int n, int[][] edges, int[] disappear) {
int[] answer = new int[n];
boolean[] visited = new boolean[n];
List<Node>[] graph = new ArrayList[n];
int INF = Integer.MAX_VALUE;
for(int i = 0; i < n; i++) {
graph[i] = new ArrayList<>();
}
for(int[] edge : edges) {
graph[edge[0]].add(new Node(edge[1], edge[2]));
graph[edge[1]].add(new Node(edge[0], edge[2]));
}
Arrays.fill(answer, INF);
answer[0] = 0;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.offer(new Node(0, 0));
while(!pq.isEmpty()) {
int now = pq.poll().idx;
if(!visited[now]) {
visited[now] = true;
for(Node next : graph[now]) {
int time = answer[now] + next.time;
if(time < answer[next.idx] && time < disappear[next.idx]) {
answer[next.idx] = time;
pq.offer(new Node(next.idx, time));
}
}
}
}
for(int i = 1; i < n; i++) {
if(answer[i] >= disappear[i]) {
answer[i] = -1;
}
}
return answer;
}
public class Node implements Comparable<Node> {
int idx;
int time;
public Node(int idx, int time) {
this.idx = idx;
this.time = time;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.time, o.time);
}
}
}
Node
클래스를 생성한다.idx
: 노드 번호time
: 해당 노드로 가기 위한 시간compareTo
메소드를 오버라이딩한다.answer
를 생성한다. 그리고 노드의 방문을 확인하는 배열 visited
를 생성한다. 배열의 크기는 모두 노드의 개수인 n
이다.graph
를 생성한다. edges
를 돌며 graph
에 노드의 연결 정보를 저장한다.graph
에서 edge[0]
와 edge[1]
의 위치에 서로의 번호와 edge[2]
의 시간을 가지는 노드를 추가한다.answer
배열을 정수의 최댓값으로 일괄 초기화하고, 0번 노드에서 시작하므로 answer[0]
에는 0
을 넣는다.pq
를 생성하고, 출발 노드의 번호 0
과 시작 시간 0
을 가진 노드를 삽입한다.pq
가 빌 때까지 다음 과정을 반복한다.now
로 한다.visited
배열에 방문처리를 한다.now
의 인접한 정점을 살피고 time
에 현재 노드에 도착하는 데 필요한 시간과 현재 노드에서 다음 노드까지 필요한 시간을 더한 값을 저장한다. time
보다 크고time
이 disappear
배열에서 다음 노드에 해당하는 시간보다 작다면time
값으로 갱신한다. 그리고 다음 노드의 번호와 time
을 가진 노드를 pq
에 삽입한다.answer
배열을 돌며 각 노드까지 가는 데 필요한 시간이 disappear
배열에서 노드에 해당하는 시간보다 크거나 같으면 값을 -1
로 갱신한다.