Leetcode Java Minimum Height Trees
업데이트:
문제
코드
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> result = new ArrayList<>();
if (n == 1) {
result.add(0);
return result;
} else if (n == 2) {
result.add(0);
result.add(1);
return result;
}
List<Integer>[] graph = new ArrayList[n];
int[] degree = new int[n];
for (int idx = 0; idx < n; idx++) {
graph[idx] = new ArrayList<>();
}
for (int[] edge : edges) {
int v1 = edge[0];
int v2 = edge[1];
degree[v1]++;
degree[v2]++;
graph[v1].add(v2);
graph[v2].add(v1);
}
Deque<Integer> deque = new ArrayDeque<>();
for (int idx = 0; idx < n; idx++) {
if (degree[idx] == 1) {
deque.add(idx);
}
}
while (n > 2) {
int size = deque.size();
n -= size;
while (size > 0) {
int idx = deque.pop();
degree[idx]--;
for (int val : graph[idx]) {
degree[val]--;
if (degree[val] == 1) {
deque.add(val);
}
}
size--;
}
}
result.addAll(deque);
return result;
}
}
결과
설명
- 주어진 정수 n과 정수 배열 edges를 이용하여 만든 Tree가 최소 높이가 되는 Tree들(Minimum Height Trees - MHTs)의 root의 값을 반환하는 문제이다.
- 주어진 정수 n은 Tree의 노드의 개수이자 노드의 값의 상한선($n - 1$)을 의미한다.
- 주어진 정수 배열인 edges는 노드간 연결 정보를 저장한 배열이다.
- 최소 높이를 저장할 result인 List를 정의하여, 주어진 n이 1과 2인 경우 아래를 수행한다.
- 주어진 n이 1인 경우, result에 0을 넣어 주어진 문제의 결과로 반환한다.
- 주어진 n이 2인 경우, result에 0과 1을 넣어 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- graph는 가능한 Tree를 만들어 넣을 List의 배열로, n의 크기와 각 위치에 ArrayList를 초기화하여 넣어준다.
- degree는 각 graph의 각 높이를 저장할 배열로, n의 크기로 초기화한다.
- edges를 반복하여 degree와 graph를 초기화한다.
- 지역 변수 v1에 edge[0], v2에 edge[1]을 넣어준다.
- degree의 v1번째 값과 v2번째 값을 증가시킨다.
- graph의 v1번째 List에 v2를 넣어주고, v2번째 List에 v1을 넣어준다.
-
deque를 정의하여 degree가 1인 값만 deque에 넣어준다.
- n이 2보다 클 때까지 반복하여 deque에 최소 높이가 되는 Tree들(MHTs)의 root 값을 넣어준다.
- 지역 변수 size에 deque의 크기를 넣어준다.
- n에 해당 size 값을 빼준다.
- size가 0보다 클 때까지 다시 반복을 수행한다.
- deque에서 값을 하나 꺼내와서 idx에 넣어준다.
- graph의 idx번째 값들을 반복하여 degree의 해당 값의 위치 값을 빼주고, 해당 값이 1이 되면 deque에 넣어준다.
- size를 감소시키고 반복을 계속 수행한다.
- 반복이 완료되면 최소 높이가 되는 Tree들(MHTs)의 root 값들을 넣은 deque의 모든 값들을 result에 넣어 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기