Leetcode Java Maximize the Number of Target Nodes After Connecting Trees I
업데이트:
문제
코드
class Solution {
public int[] maxTargetNodes(int[][] edges1, int[][] edges2, int k) {
List<List<Integer>> list = this.parseList(edges2);
int max = 0;
for (int i = 0; i < list.size(); i++) {
max = Math.max(max, this.dfs(list, k - 1, i, -1));
}
list = this.parseList(edges1);
int length = list.size();
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = this.dfs(list, k, i, -1) + max;
}
return result;
}
private List<List<Integer>> parseList(int[][] edges) {
int length = edges.length + 1;
List<List<Integer>> list = new ArrayList<>(length);
for (int i = 0; i < length; i++) {
list.add(new ArrayList<>());
}
for (int[] edge : edges) {
list.get(edge[0]).add(edge[1]);
list.get(edge[1]).add(edge[0]);
}
return list;
}
private int dfs(List<List<Integer>> list, int k, int i, int target) {
if (k < 0) {
return 0;
} else {
int count = 1;
for (int value : list.get(i)) {
if (value != target) {
count += this.dfs(list, k - 1, value, i);
}
}
return count;
}
}
}
결과
설명
-
노드간 연결 선 정보가 있는 edges1, edges2를 이용하여 edges1에서 edges2의 임의 노드에 연결하여 k번 이하 이동을 통해 연결할 수 있는 최대 노드의 갯수를 반환하는 문제이다.
- 각 edges 배열을 이용하여 노드 연결 정보를 List로 변환할 parseList(int[][] edges) 메서드를 정의한다.
- length는 list의 길이를 저장할 변수로, [0, $n - 1$] 범위의 값이 존재하므로 edges의 길이보다 1 큰 값을 넣어준다.
- list는 각 노드의 연결 정보를 저장할 변수로, [0, $n - 1$] 위치에 ArrayList를 넣어 초기화 후 edges를 순차적으로 edge에 넣고 각 노드 위치에 반대편 노드 위치를 넣어주 후 반환한다.
- DFS 방식으로 연결된 노드의 갯수를 계산할 dfs(List<List<Integer>> list, int k, int i, int target) 메서드를 정의한다.
- k가 0 미만인 이동 위치가 없으면, 0을 반환한다.
- k가 0 이상인 경우, 아래를 반복한다.
- count는 연결된 노드 갯수를 계산하기 위한 변수로, 현재 연결된 노드를 포함하여 1로 초기화한다.
- list의 i번째 값들을 순차적으로 value에 넣고 k에 $k - 1$인 이동 횟수를 차감 후 i와 target 위치에 value와 i를 순차적으로 넣어 재귀 호출한 값을 count에 더해준다.
- 반복을 통해 계산된 count를 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- list는 연결된 노드 정보를 저장할 변수로, 우선 edges2로 parseList(int[][] edges) 메서드를 수행한 결과를 넣어준다.
- max는 edges2에서 k 이동거리 내 노드가 최대인 갯수를 저장할 변수로, list를 반복하여 k에 $k - 1$인 이동 횟수를 차감 후 target 위치에 -1을 넣어 dfs(List<List<Integer>> list, int k, int i, int target) 메서드를 수행한 값 중 최댓값을 저장한다.
- length는 edges1의 길이를 저장한 변수이다.
- result는 결과를 저장할 변수로, length 길이의 정수 배열로 초기화한다.
-
list에 다시 edges1으로 parseList(int[][] edges) 메서드를 수행한 결과를 넣어준다.
- 0부터 length 미만까지 i를 증가시키며, result[i]의 위치에 아래 두 값의 합을 넣어준다.
- target을 -1로 넣고 dfs(List<List<Integer>> list, int k, int i, int target) 메서드를 수행한 결과인 edges1 내 i번째 노드에서 연결 가능한 노드의 갯수.
- edges2에서 최대 연결 가능한 노드 갯수인 max의 값.
- 반복이 완료되면 각 노드 별 최대 연결 가능한 노드의 수가 저장된 count를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기