Leetcode Java All Ancestors of a Node in a Directed Acyclic Graph
업데이트:
문제
코드
class Solution {
public List<List<Integer>> getAncestors(int n, int[][] edges) {
List<List<Integer>> result = new ArrayList<>();
List<List<Integer>> childs = new ArrayList<>();
for (int i = 0; i < n; i++) {
result.add(new ArrayList<>());
childs.add(new ArrayList<>());
}
for (int[] edge : edges) {
childs.get(edge[0]).add(edge[1]);
}
for (int i = 0; i < n; i++) {
this.dfs(result, childs, i, i);
}
return result;
}
private void dfs(List<List<Integer>> result, List<List<Integer>> childs, int node, int curr) {
for (int child : childs.get(curr)) {
List<Integer> list = result.get(child);
if (list.size() == 0 || list.get(list.size() - 1) != node) {
list.add(node);
this.dfs(result, childs, node, child);
}
}
}
}
결과
설명
-
노드 간 연결 선 목록인 edge를 이용하여 각 노드들로 이동 가능한 노드들의 목록을 반환하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 각 노드들로 이동 가능한 노드들을 저장하기 위한 변수로, ArrayList로 초기화하고 n개의 ArrayList를 넣어준다.
- childs는 각 노드가 이동하는 경로를 넣어줄 변수로, ArrayList로 초기화하고 edges를 이용하여 첫 번째 값에 해당하는 ArrayList에 두 번째 값을 넣어준다.
-
0부터 n까지 i를 증가시키며 4번에서 정의한 dfs(List<List
> result, List<List > childs, int node, int curr) 메서드의 node와 curr에 i를 넣고 수행한다. - DFS 방식으로 각 노드로 이동 가능한 노드들을 탐색할 dfs(List<List
> result, List<List > childs, int node, int curr) 메서드를 정의한다. - childs의 curr에 해당하는 노드들을 순차적으로 child에 넣어 아래를 수행한다.
- list에 result의 child번째 ArrayList를 꺼내 넣어준다.
- list가 비어있거나 list의 마지막 값이 node가 아닌 이동 가능한 경로인 경우, list에 node를 넣고 curr 자리에 child를 넣어 재귀 호출을 수행한다.
- childs의 curr에 해당하는 노드들을 순차적으로 child에 넣어 아래를 수행한다.
- 수행이 완료되어 모든 이동 가능한 노드들이 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기