Algorithm
프로그래머스 - 전력망을 둘로 나누기 (BFS + 완전탐색)
qkrwnsmir
2025. 5. 8. 15:41
2차원리스트로 각 노드의 연결정보가 주어지고,
연결된 트리노드를 한곳 절단했을 때 두 트리의 노드수 차이가 최소가 되도록 하고 그 차이를 return하는 문제이다.
문제를 보자마자 생각했던 흐름은
하나의 연결(원소 pop하기)을 빼고, 딕셔너리에 저장한 뒤 BFS로 해당 트리의 노드개수를 계산하고 차이를 업데이트 한다.
였다.
한쪽 트리만 해줘도 되는 이유는 5개의 노드에서 한트리가 3개라면 나머지하나는 자동으로 2가되고 차이도 당연히 알 수 있기 때문이다.
for문으로 크게 감싸 i번쨰 원소를 pop해주고 위의 로직대로 진행해준다.
쉬운 문제.
from collections import defaultdict, deque
def bfs(graph):
queue = deque()
visited = set()
queue.append(1)
while queue:
curr_node = queue.popleft()
if curr_node not in visited:
visited.add(curr_node)
queue.extend(graph[curr_node])
return len(visited)
def solution(n, wires):
part = 0
answer = 987654321
for i in range(n):
i_wires = wires[:i] + wires[i+1:]
graph = defaultdict(list)
for a, b in i_wires:
graph[a].append(b)
graph[b].append(a)
part = bfs(graph)
if answer > abs(n - part - part):
answer = abs(n - part - part)
return answer