📜 문제 설명
n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망
네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.
송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 2 이상 100 이하인 자연수입니다.
- wires는 길이가 n-1인 정수형 2차원 배열입니다.
- wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.
- 1 ≤ v1 < v2 ≤ n 입니다.
- 전력망 네트워크가 하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/86971
💡 문제 풀이
위의 그림처럼 9개의 전력망이 있다고 가정할 때 한 개의 선을 끊어서 두 네트워크가 가진 전력망의 차이를 최소화하는 방법은 4번과 7번을 연결한 선을 끊는 방법이다.
그러면 각각 6개, 3개의 네트워크를 가지게 된다.
물론 3번과 4번을 끊어도 결과는 동일하다.
완전탐색 + bfs로 푼 문제이다.
선이 연결된 그래프 정보를 만들어두고 선을 하나씩 끊어보면서 차이가 최소화되는 경우를 리턴해주었다.
def bfs(n, status):
a = 1
visited = [0 for _ in range(n + 1)]
Q = []
visited[0] = True
Q.append(1)
visited[1] = True
while Q:
cur = Q.pop(0)
for i in status[cur]:
if not visited[i]:
Q.append(i)
visited[i] = True
a += 1
return abs((n - a) - a)
def solution(n, wires):
ans = 9999
status = [[] for _ in range(n + 1)]
num = 0
for i in range(len(wires)):
status[wires[i][0]].append(wires[i][1])
status[wires[i][1]].append(wires[i][0])
while num <= len(wires) - 1:
status[wires[num][0]].remove(wires[num][1])
status[wires[num][1]].remove(wires[num][0])
if num != 0:
status[wires[num - 1][0]].append(wires[num - 1][1])
status[wires[num - 1][1]].append(wires[num - 1][0])
num += 1
result = bfs(n, status)
if result < ans:
ans = result
return ans
반응형
'✨APS (Algorithm Problem Solving) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] LV.0 숨어있는 숫자의 덧셈 (1) / 자바(JAVA) (0) | 2022.11.22 |
---|---|
[프로그래머스] LV.3 스티커 모으기(2) / 파이썬(Python) (0) | 2022.11.17 |
[프로그래머스] LV.2 할인 행사 / 파이썬(Python) (0) | 2022.11.14 |
[프로그래머스] LV.1 과일 장수 / 파이썬(Python) (0) | 2022.11.11 |
[프로그래머스] LV.0 로그인 성공? / 자바(JAVA) (0) | 2022.11.10 |