Leetcode Java Find Eventual Safe States
업데이트:
문제
코드
class Solution {
public List<Integer> eventualSafeNodes(int[][] graph) {
List<Integer> result = new ArrayList<>();
int length = graph.length;
int[] state = new int[length];
for (int idx = 0; idx < length; idx++) {
if (this.dfs(graph, state, idx)) {
result.add(idx);
}
}
return result;
}
private boolean dfs(int[][] graph, int[] state, int index) {
if (state[index] != 0) {
return state[index] == 1;
} else {
state[index] = 2;
for (int node : graph[index]) {
if (!this.dfs(graph, state, node)) {
return false;
}
}
state[index] = 1;
return true;
}
}
}
결과
설명
- [0, $n - 1$]까지 n개의 노드의 방향이 저장된 graph는 각각 아래의 노드로 구분이 되며, 그 중 안전한 노드를 찾아 오름차순으로 정렬하여 반환하는 문제이다.
- 터미널 노드는 나가는 방향이 없는 노드이다.
- 안전한 노드는 터미널 노드 또는 안전한 노드로 이어지는 노드이다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 안전한 노드를 오름차순 저장하여 반환할 변수로, ArrayList로 초기화한다.
- length는 graph의 길이를 저장한 변수이다.
- state는 n개의 노드의 각 상태를 저장할 배열로, length 크기로 초기화하며 아래의 각 상태를 가진다.
- 0은 아직 노드를 탐색하지 않은 값이다.
- 1은 안전한 노드를 의미하는 값이다.
- 2는 안전하지 않은 노드를 의미하는 값이다.
- 0부터 length 미만까지 idx를 증가시키며 아래를 검증한다.
- 4번에서 정의한 dfs(int[][] graph, int[] state, int index) 메서드에 각 변수와 idx를 넣어 수행한 결과가 true인 안전한 노드인 경우, result에 idx를 넣어준다.
- DFS 방식으로 graph 내 안전한 노드를 찾기 위한 dfs(int[][] graph, int[] state, int index) 메서드를 정의한다.
- state의 index번째 상태가 0인 탐색하지 않은 노드가 아니라면, 해당 값이 1인 안전한 노드인지 검증한 결과를 반환한다.
- 위의 경우가 아니라면 아래를 수행한다.
- state의 index번째 값에 안전하지 않은 노드라는 의미의 2를 넣어준다.
- graph의 index번째 값들을 node에 넣어 반복하여 index 자리에 해당 값으로 재귀 호추한 결과가 false인 경우 안전하지 않은 노드이므로, false를 반환한다.
- 위의 반복이 완료되면 안전한 노드이므로 state의 index번째 값에 1을 넣고, true를 반환한다.
- 3번의 반복이 완료되면 안전한 노드를 오름차순으로 저장한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기