[Programmers] 전력망을 둘로 나누기

Question

Language: Python

트리로 된 전력망에서 전선을 하나 끊게 되면 2개의 트리형태의 전력망이 생성된다. 이때 각 전력망이 가지는 송전탑의 개수의 차이를 최소화하는 것이다. n이 2이상 100이하이므로 모든 경우에 대해서 송전탑 개수 차이를 비교해도 시간 내에 풀이가 가능하다.

우선, 같은 전력망에 있는지를 판별하기 위해 disjoint set을 활용한다.

Algorithm

for i in range(len(dungeons)):
    if not visited[i] and k>=dungeons[i][0]:
        visited[i]=True
        dfs(k-dungeons[i][1],visited,dungeons,[i])
        visited[i]=False

다음과 같이 모든 경우의 대해서, 방문 하거나, 방문 안 하거나의 경우를 따져서 재귀문을 통해 답을 구하면 된더.

Solution

from collections import Counter
from math import inf
def find_parent_compressed(parents,x):
    if x!= parents[x]:
        parents[x]=find_parent_compressed(parents,parents[x])
    return parents[x]
def union_parents(parents,x,y):
    pre_x=find_parent_compressed(parents,x)
    pre_y=find_parent_compressed(parents,y)
    
    if pre_x < pre_y:
        parents[pre_x]=pre_y
    else:
        parents[pre_y]=pre_x
        
def solution(n, wires):
    answer=inf
    for i in range(n-1):
        parents=[i for i in range(n+1)]

        for j in range(n-1):
            if i==j:
                continue
            
            union_parents(parents,wires[j][0],wires[j][1])

        #마지막에 한 번 더 부모 노드를 최신화해준다.
        for v in range(1,n+1):
            find_parent_compressed(parents,v)

        answer=min(answer,abs(list(Counter(parents[1:]).values())[0]-list(Counter(parents[1:]).values())[1]))
    return answer

댓글남기기