Algorithms
[프로그래머스] 전력망 둘로 나눈기(Python)
짤진이
2024. 10. 24. 00:14
반응형
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/86971
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 이해
n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.
송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 2 이상 100 이하인 자연수입니다.
- wires는 길이가 n-1인 정수형 2차원 배열입니다.
문제를 처음 이해했을 때는 어떻게 풀어야할 지 이해가 되지않았지만 BFS 방식을 사용하면 쉽게 풀 수 있을 것이라고 생각했다.
1. 그래프에 접합 노드들을 전부 추가한다.
2. BFS 함수를 만든 후 인접한 노드들의 갯수를 구하는 함수를 만든다.
3. wires에 있는 연결 노드들을 순회하며 하나씩 연결을 끊고(remove함수) bfs로 갯수의 차이를 구한다.
4. 연결을 끊은 노드들은 다시 연결시켜준다.
*이렇게 하면 시간 초과가 날 줄 알았는데 값이 잘 나왔다(?)
코드
from collections import deque
def solution(n, wires):
answer = -1
graph = [[] for _ in range(n+1)]
for wire in wires:
graph[wire[0]].append(wire[1])
graph[wire[1]].append(wire[0])
def bfs(val):
visited = [0 for _ in range(n+1)]
q = deque()
q.append(val)
cnt = 1
visited[val] = 1
while q:
node = q.popleft()
for tmp in graph[node]:
if visited[tmp] == 0:
q.append(tmp)
visited[tmp] = 1
cnt += 1
return cnt
res = n
for wire in wires:
graph[wire[0]].remove(wire[1])
graph[wire[1]].remove(wire[0])
res = min(abs(bfs(wire[0])-bfs(wire[1])),res)
graph[wire[0]].append(wire[1])
graph[wire[1]].append(wire[0])
return res
반응형