<Medium> Minimum Height Trees (LeetCode : C#)

이도희·2023년 6월 30일
0

알고리즘 문제 풀이

목록 보기
113/185

https://leetcode.com/problems/minimum-height-trees/

📕 문제 설명

노드 개수 n이 주어지고 edge정보가 주어질 때 최소 신장 트리의 root 반환하기

edges[i] = [a_i, b_i]

  • Input
    노드 개수 n, edge 정보 (int[][])
  • Output
    최소 신장 트리 root 반환

예제

풀이

최소 높이를 구성하기 위해서는 가장 연결이 많은 노드를 루트로 잡아야한다. 리프 노드를 하나씩 제거하면서 남은 값을 찾아나가면 해당 노드를 찾을 수 있다. 마지막에 남은 값이 짝수 개일 때는 루트가 2개가 될 수 있으므로 2까지 while을 돌린다.

public class Solution {
    public IList<int> FindMinHeightTrees(int n, int[][] edges) { 
        
        if (edges.Length == 0) return new List<int>() {0};
        List<List<int>> adjList = new List<List<int>>();
        
        for (int i = 0; i < n; i++)
        {
            adjList.Add(new List<int>());
        }
            
        for (int i = 0; i < edges.Length; i++) // 그래프 정보 초기화 
        {
            adjList[edges[i][0]].Add(edges[i][1]);
            adjList[edges[i][1]].Add(edges[i][0]);
        }
        
        Queue<int> queue = new Queue<int>();
        // 첫번째 리프노드 추가 
        for (int i=0; i < n; i++)
        {
            if(adjList[i].Count == 1) queue.Enqueue(i);
        }
        // 가장 연결이 많은 노드가 루트가 되어야 높이가 최소가 된다
        while (n > 2)
        {
            int size = queue.Count;
            // 루트 남길때까지 반복 제거 
            for (int i = 0; i < size; i++)
            {
                int currentLeaf = queue.Dequeue();
                int neighbor = adjList[currentLeaf][0];
                adjList[neighbor].Remove(currentLeaf);
                adjList[currentLeaf].Remove(neighbor);
                
                if (adjList[neighbor].Count == 1) // 다음 리프노드 할당 
                {
                    queue.Enqueue(neighbor);
                }
            }
            
            n = n - size;
        }
        
        return queue.ToArray();
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글