[Programmers] 전력망을 둘로 나누기 바로가기
n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.
송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.
n | wires | result |
---|---|---|
9 | [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] | 3 |
4 | [[1,2],[2,3],[3,4]] | 0 |
7 | [[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]] | 1 |
입출력 예 #1
다음 그림은 주어진 입력을 해결하는 방법 중 하나를 나타낸 것입니다.
4번과 7번을 연결하는 전선을 끊으면 두 전력망은 각 6개와 3개의 송전탑을 가지며, 이보다 더 비슷한 개수로 전력망을 나눌 수 없습니다.
또 다른 방법으로는 3번과 4번을 연결하는 전선을 끊어도 최선의 정답을 도출할 수 있습니다.
입출력 예 #2
다음 그림은 주어진 입력을 해결하는 방법을 나타낸 것입니다.
2번과 3번을 연결하는 전선을 끊으면 두 전력망이 모두 2개의 송전탑을 가지게 되며, 이 방법이 최선입니다.
입출력 예 #3
다음 그림은 주어진 입력을 해결하는 방법을 나타낸 것입니다.
3번과 7번을 연결하는 전선을 끊으면 두 전력망이 각각 4개와 3개의 송전탑을 가지게 되며, 이 방법이 최선입니다.
wires
)의 상태를 2차원 배열인 matrix
에 저장한다.wires
)을 1개씩 제거하여 2개의 전력망으로 분할한 후 각 전력망이 가지는 송전탑의 차이의 절대값을 계산한다.✍ 코드
def dfs(matrix, n):
visited = [0, 0] + [1] * (n-1)
stack = [1]
a, b = 1, 1
while stack:
node = stack.pop()
for i in range(1,n+1):
if matrix[node][i] and visited[i] == 1:
visited[i] = 0
stack.append(i)
a += 1
node = visited.index(1)
stack.append(node)
visited[node] = 0
while stack:
node = stack.pop()
for i in range(1,n+1):
if matrix[node][i] and visited[i] == 1:
visited[i] = 0
stack.append(i)
b += 1
return abs(a - b)
def solution(n, wires):
answer = 100
matrix = [[0]*(n+1) for _ in range(n+1)]
for s, e in wires:
matrix[s][e], matrix[e][s] = 1, 1
for s, e in wires:
matrix[s][e], matrix[e][s] = 0, 0
answer = min(answer, dfs(matrix,n))
matrix[s][e], matrix[e][s] = 1, 1
return answer