-
[Algorithm - 프로그래머스] Python 전력망을 둘로 나누기Programming/Algorithm 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))
위와같이 한쪽 트리의 전력망 갯수를 알게되면 나머지 하나의 트리의 전력망의 갯수도 알 수 있다.
'Programming > Algorithm' 카테고리의 다른 글
[Algorithm - 프로그래머스] Python 조이스틱 (0) 2021.11.21 [Algorithm - 프로그래머스] Python 숫자 문자열과 영단어 (0) 2021.10.21 [Algorithm - 프로그래머스] Python 신규 아이디 추천 (0) 2021.10.20 [Algorithm - 프로그래머스] Python 로또의 최고 순위와 최저 순위 (0) 2021.10.19 [Algorithm] Python 1부터 n까지의 합 (0) 2021.09.23