Programming/Algorithm
[Algorithm - 프로그래머스] Python 전력망을 둘로 나누기
100winone
2021. 11. 23. 21:06
문제 (LV.2)
https://programmers.co.kr/learn/courses/30/lessons/86971
코드
answer = 0
def bfs(wires, checked, num, cnt):
global answer
q = [num]
while len(q) != 0:
cur = q.pop(0)
for i in range(0, len(wires)):
if wires[i][0] == cur:
if checked[wires[i][1]] == 0:
checked[wires[i][1]] = 1
q.append(wires[i][1])
cnt += 1
elif wires[i][1] == cur:
if checked[wires[i][0]] == 0:
checked[wires[i][0]] = 1
q.append(wires[i][0])
cnt += 1
tmp_len = len(wires) + 1
tmp = abs(cnt - (tmp_len - cnt))
answer = min(answer, tmp)
return answer
def solution(n, wires):
global answer
answer = 1000
for i in range(0, n - 1):
checked = [0 for _ in range(102)]
checked[wires[i][0]] = 1
checked[wires[i][1]] = 1
bfs(wires, checked, wires[i][0], 1)
return answer
해설
전력망은 위와같이 트리형태로 이루어져 있다는 점에서 BFS를 문제에 적용하였다.
BFS를 사용과 동시에 wires 리스트에 있는 모든 노드가 한번 씩 끊긴 경우를 판단하여 차이의 최솟값을 구해주어야 한다.
한 노드가 끊어진 경우에 두개의 트리가 나누어지게 되는데 이때, BFS를 한번 돌게되면
tmp = abs(cnt - (tmp_len - cnt))
위와같이 한쪽 트리의 전력망 갯수를 알게되면 나머지 하나의 트리의 전력망의 갯수도 알 수 있다.