프로그래머스/lv.2
전력망을 둘로 나누기
bingual
2024. 3. 6. 20:30
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/86971
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
해당 문제는 dfs를 활용해서 푸는 게 효율적인 풀이방법이다.
- 지문을 보면 트리의 루트는 1부터 시작하며 크기는 n이다. 따라서 n 만큼의 크기를 가진 딕셔너리를 선언해 주고 각각 연결된 노드를 트리 형태의 그래프로 표현해 준다.
- dfs를 실행하여 현재 노드의 연결되어 있는 자식 노드를 기준으로 깊이 탐색을 해준다. 그리고 재귀가 종료될 때마다 answer를 업데이트해 주는데 전체 간선의 개수는 n - 1이다 그중 전선을 하나 끊은 뒤 두 전력망의 노드 개수를 비교해야 하므로 현재 노드에서 특정 간선을 하나 끊었을 때 서브 트리의 크기와 기존 트리의 크기를 비교해준다.
def solution(n, wires):
answer = float("inf")
def dfs(current, parent):
nonlocal answer
size = 1
for child in graph[current]:
if child != parent:
size += dfs(child, current)
answer = min(answer, abs(n - 2 * size))
return size
graph = {i: [] for i in range(1, n + 1)}
for x, y in wires:
graph[x].append(y)
graph[y].append(x)
dfs(1, 0)
return answer