99클럽 코테 스터디 24일차 TIL + 완전탐색

gahyunkim·2024년 11월 20일

항해99

목록 보기
24/34
post-thumbnail

프로그래머스 전력망을 둘로 나누기

문제 설명

n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.

송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.


[제한사항]

  • n은 2 이상 100 이하인 자연수입니다.
  • wires는 길이가 n-1인 정수형 2차원 배열입니다.
    • wires의 각 원소는 [v1, v2] 2개의 자연수로 이루어져 있으며, 이는 전력망의 v1번 송전탑과 v2번 송전탑이 전선으로 연결되어 있다는 것을 의미합니다.
    • 1 ≤ v1 < v2 ≤ n 입니다.
    • 전력망 네트워크가 하나의 트리 형태가 아닌 경우는 입력으로 주어지지 않습니다.

[입출력 예]

nwiresresult
9[[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]3
4[[1,2],[2,3],[3,4]]0
7[[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]]1

문제해석하기

  • 전력망 표현하기
    • 전력망은 그래프 구조로 표현된다. wires간선 목록이고, 노드는 1번부터 n번까지 번호가 매겨진다.
  • 하나의 전선 제거
    • 전선 하나를 제거하면 그래프가 두 개의 서브그래프로 나뉘게 된다
    • 각 서브그래프에 포함된 노드 개수를 계산한다.
  • 차이 계산
    • 두 서브그래프의 노드 개수 차이를 계산하고, 모든 전선에 대해 최소값을 찾는다
  • wires를 이용해 각 노드의 연결 관계를 인접 리스트로 표현하여 그래프를 구성해준다.
  • 각 전선을 하나씩 제거하고, 그래프가 두 개의 서브그래프로 나뉘었을 때 각 서브그래프의 노드 개수를 계산한다.
  • BFS(또는 DFS)를 사용해 서브그래프를 탐색하고, 노드 개수를 세어 두 그래프의 차이를 계산해준다.
  • 모든 경우에 대해 노드 개수 차이를 비교하여 최소값을 반환합니다.
from collections import defaultdict, deque

def solution(n, wires):
    def bfs(start, graph, visited):
        queue = deque([start])
        visited[start] = True
        count = 1

        while queue:
            node = queue.popleft()
            for neighbor in graph[node]:
                if not visited[neighbor]:
                    visited[neighbor] = True
                    queue.append(neighbor)
                    count += 1
        return count

    graph = defaultdict(list)
    for a, b in wires:
        graph[a].append(b)
        graph[b].append(a)

    min_difference = float('inf')

    for a, b in wires:
        # Remove the wire
        graph[a].remove(b)
        graph[b].remove(a)

        visited = [False] * (n + 1)

        count = bfs(a, graph, visited)
        difference = abs(n - 2 * count)
       
        min_difference = min(min_difference, difference)

        graph[a].append(b)
        graph[b].append(a)

    return min_difference

오늘의 회고

dfs와 bfs를 사용하면서 완전 탐색을 진행해볼 수 있어서 좋았다. 문제의 입출력 예가 너무 많고 복잡해서 어렵게 느껴졌는데 그래도 해결해낼 수 있어서 좋은 경험이었다.

0개의 댓글