Leetcode Java Shortest Path with Alternating Colors
업데이트:
문제
코드
class Solution {
public int[] shortestAlternatingPaths(int n, int[][] redEdges, int[][] blueEdges) {
Set<Integer>[][] set = new Set[n][2];
for (int i = 0; i < n; i++) {
set[i][0] = new HashSet<>();
set[i][1] = new HashSet<>();
}
for (int[] redEdge : redEdges) {
set[redEdge[0]][0].add(redEdge[1]);
}
for (int[] blueEdge : blueEdges) {
set[blueEdge[0]][1].add(blueEdge[1]);
}
int[][] paths = new int[n][2];
for (int i = 1; i < n; i++) {
paths[i][0] = paths[i][1] = n * 2;
}
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[] { 0, 0 });
queue.offer(new int[] { 0, 1 });
while (!queue.isEmpty()) {
int[] curr = queue.poll();
int row = curr[0];
int col = curr[1];
for (int node : set[row][1 - col]) {
if (paths[node][1 - col] == n * 2) {
paths[node][1 - col] = paths[row][col] + 1;
queue.offer(new int[] { node, 1 - col });
}
}
}
int[] result = new int[n];
for (int i = 0; i < n; i++) {
int min = Math.min(paths[i][0], paths[i][1]);
result[i] = min == n * 2 ? -1 : min;
}
return result;
}
}
결과
설명
- n개의 노드의 각 색깔별 이동 경로가 저장된 redEdges와 blueEdges를 이용하여 색을 번갈아가면서 0번 노드에서 각 노드까지 최단 경로를 구하는 문제이다.
- 단, 경로가 존재하지 않으면 -1을 넣어준다.
- 문제 풀이에 필요한 변수를 정의한다.
- set은 노드 별 도착 노드를 저장할 변수로, red와 blue를 순차적으로 넣기 위해 $n \times 2$ 크기의 Set 배열로 정의하여 redEdges는 노드 별 첫 번째 HashSet에 blueEdges는 노드 별 두 번째 HashSet에 도착 노드를 넣어준다.
- paths는 노드 별 색깔을 번갈아 이동하기 위한 횟수를 저장할 변수로, $n \times 2$ 크기의 2차원 정수 배열로 초기화하고 모든 값에 최대 가능한 경우보다 큰 $n \times 2$를 넣어준다.
- 최대 가능한 경우는 노드로 이동하는 경로와 자기 자신을 회귀하는 아래의 경우와 같다.
- n = 3, redEdges = [[0, 1], [1, 2]], blueEdges = [[1, 1]] 일때, 0에서 2까지 최소 3번의 단계를 거친다.
- 위를 기반으로 $(2 \times(n - 2)) + 1 = (n \times 2) - 3$이 최소 이동 횟수가 된다.
- queue는 redEdges와 blueEdges를 순차적으로 탐색하기 위한 변수로, LinkedList로 초기화 후 [0, 0]과 [0, 1]을 순차적으로 넣어준다.
- queue가 비어있지 않을 때 까지 아래를 반복한다.
- curr은 현재 순서를 저장할 변수로, queue의 첫 값을 빼서 넣어준다.
- row와 col은 curr의 첫 번째 값과 두 번째 값을 순차적으로 넣은 변수이다.
- set[row][$1 - col$]의 값을 순차적으로 node에 넣어 아래를 수행한다.
- paths[node][$1 - col$]의 값이 초기 값인 $n \times 2$인 경우, paths[node][$1 - col$]의 위치에 path[row][col]의 값에 1을 더한 값을 넣어 준 후 queue에 [node, $1 - col$]을 넣어준다.
-
result는 각 노드까지 최단 경로를 저장할 변수로, n 크기의 정수 배열로 초기화한다.
- result의 i번째 위치에 paths의 i번째 위치에 해당하는 두 경로 중 작은 값을 넣은 후 주어진 문제의 결과로 반환한다.
- 단, 가장 작은 값이 초기값인 $n \times 2$면 경로가 없으므로 -1을 넣어준다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기