Programmers

[프로그래머스 / 파이썬 풀이] 전력망을 둘로 나누기

Hoo_Dev 2023. 1. 12. 10:37
from collections import deque

def solution(n, wires):
    min = 10000000000
    
    # 원본이 바뀌지 않도록 배열을 새로 복사를 해주고 pop(i)를 통해 줄을 하나씩 끊는다.
    for i in range(n-1):
        global visited
        wires2 = wires[::]
        graph = [[] for _ in range(n+1)]
        wires2.pop(i)
        visited = [0] * (n+1)
        
        for j in wires2:
            graph[j[0]].append(j[1])
            graph[j[1]].append(j[0])
        
        def dfs(i):
            global visited
            global cnt
            visited[i] = 1
            for j in graph[i]:
                if visited[j] == 0:
                    visited[j] = 1
                    cnt += 1
                    dfs(j)
            return cnt

        # 노드의 개수를 cnt로 세준다음 cal안에 저장시킨다.
        cal = []
        for x in range(1, n+1):
            global cnt
            cnt = 0
            if visited[x] == 0:
                cal.append(dfs(x))
        
        # cal 안의 갚을 서로 빼준 후 절댓값을 씌워 전력망들의 차이가 가장 적은 것을 찾는다.
        if min > abs(cal[0] - cal[1]):
            min = abs(cal[0] - cal[1])

    return min
  1. 원본을 해치치 않게끔 슬라이싱을 통해 원본을 복제한다.
  2. 반복문과 pop을 통해 줄을 하나씩 끊어본다.
  3. 끊은 줄을 통해 dfs를 돌리고, 노드들의 개수를 세준다.
  4. 센 노드들의 서로의 차를 구하고 절댓값을 씌워 최솟값과 비교한다.