본문 바로가기

Algorithm/BFS

(Python3) - LeetCode (Hard) : 3203. Find Minimum Diameter After Merging Two Trees

반응형

https://leetcode.com/problems/find-minimum-diameter-after-merging-two-trees

트리의 지름을 구하는 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

인접리스트 graph1, graph2를 구해줍니다.

📔 풀이과정

* 트리의 지름은 bfs를 두 번 수행해 구할 수 있습니다.* n개의 노드에 대해 n-1개의 간선이 보장되므로 노드번호 띄엄띄엄 포함된 간선이 입력으로 들어오는 경우가 없습니다.1. 첫 번째 bfs로 끝 노드를 구한 뒤 해당 노드를 시작점으로 두 번째 bfs를 수행한다면 트리의 지름이 나옵니다.

 

2. 해당 부분을 bfs_diameter라는 함수를 선언해 bfs를 두 번 수행한 결과로 구한 지름 diameter를 구하고 반환합니다.

 

3. 트리를 잇게 된다면 최소 트리 지름은 각 트리의 중심점끼리 잇는 방법 뿐입니다. 

📔 정답출력

홀수 지름을 가진 트리가 있다면 1을 더해 짝수로 만들고 2로 나눠 가장 근접한 트리의 반지름을 구해 서로 더한 값에서 중심사이 연결점 끼리 이어저 길어진 1을 더해줍니다.

edges2가 단일 노드인 경우, edges1가 단일 노드인 경우, (각 트리의 지름+1) // 2 + 1의 최댓값을 반환합니다.


📕 Code

📔 Python3

from collections import deque, defaultdict
class Solution:
    def minimumDiameterAfterMerge(self, edges1: List[List[int]], edges2: List[List[int]]) -> int:
        def build_graph(edges):
            graph = defaultdict(list)
            for edge in edges:
                graph[edge[0]].append(edge[1])
                graph[edge[1]].append(edge[0])
            return graph

        def bfs_diameter(graph):
            def bfs(start):
                dq = deque([(start,0)])
                visited = {}
                visited[start] = True
                furthest_node, max_dist = start, 0
                while dq:
                    node, dist = dq.popleft()
                    for next in graph[node]:
                        if visited.get(next):
                            continue
                        visited[next] = True
                        if dist + 1 > max_dist:
                            furthest_node, max_dist = next, dist + 1
                        dq.append((next, dist + 1))
                return furthest_node, max_dist
            
            furthest_node, _ = bfs(0)
            _, diameter = bfs(furthest_node)

            return diameter

        graph1 = build_graph(edges1)
        graph2 = build_graph(edges2)
        diameter1 = bfs_diameter(graph1)
        diameter2 = bfs_diameter(graph2)

        return max((diameter1), (diameter2), (diameter1 + 1) // 2 + (diameter2 + 1) // 2 + 1)

 


📕 Test Case

 몇 가지 반례를 직접 작성해 보았습니다. 

input

edges1 = [0,1]

edges2 = []

2

 

input

edges1 = []

edges2 = []

1

 

input

edges1 = [[0, 1], [1, 2]]

edges2 = [[0, 1], [1, 2], [2, 3]]

5


*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.