[이것이 코딩테스트다] 어두운 길

Turtle·2024년 9월 25일
0
post-thumbnail

🗃️문제 설명

한 마을은 N개의 집과 M개의 도로로 구성되어 있습니다. 각 집은 0번부터 N - 1번까지의 번호로 구분됩니다. 모든 도로에는 가로등이 구비되어 있는데, 특정한 도로의 가로등을 하루 동안 켜기 위한 비용은 해당 도로의 길이와 동일합니다. 예를 들어 2번 집과 3번 집 사이를 연결하는 길이가 7인 도로가 있다고 해봅시다. 하루동안 이 가로등을 켜기 위한 비용은 7이 됩니다. 정부에서는 일부 가로등을 비활성화하되, 마을에 있는 임의의 두 집에 대하여 가로등이 켜진 도로만을 절약하고자 합니다. 마을의 집과 도로 정보가 주어졌을 때, 일부 가로등을 비활성화하여 절약할 수 있는 최대 금액을 출력하는 프로그램을 작성하세요.

첫째 줄에 집의 수 N(1 ≤ N ≤ 200,000)과 도로의 수 M(N-1 ≤ M ≤ 200,000)이 주어집니다.

다음 M개의 줄에 걸쳐서 각 도로에 대한 정보 X, Y, Z가 주어지며, 공백으로 구분합니다.(0 ≤ X, Y ≤ N) 이는 X번 집과 Y번 집 사이에 양방향 도로가 있으며, 그 길이가 Z라는 의미입니다. 단, X와 Y가 동일한 경우는 없으며 마을을 구성하는 모든 도로의 길이 합은 2의 31제곱보다 작습니다.

첫째 줄에 일부 가로등을 비활성화하여 절약할 수 있는 최대 금액을 출력합니다.

🖥️코드

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
parent = [i for i in range(N+1)]

def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

def union(a, b):
    a = find(a)
    b = find(b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

edges = []
for _ in range(M):
    x, y, z = map(int, input().split())
    edges.append([z, x, y])

edges.sort()
result = 0
total = 0 
for edge in edges:
    cost, a, b = edge
    total += cost
    if find(a) != find (b):
        union(a, b)
        result += cost
print(total - result)

🧠아이디어

알고리즘 유형 : 유니온 파인드 + 최소 스패닝 트리

문제에서 구하고자 하는 것 : 일부 가로등을 비활성화하여 절약할 수 있는 최대 금액

따라서 전체 가로등을 켤 때 비용에서 모든 두 집이 서로 도달 가능하며 가로등이 모두 켜져있을 때 구성되는 최소 스패닝 트리의 가로등 비용을 빼면 된다.

🔒문제 출처 및 참고 코드

이것이 코딩테스트다 with 파이썬 - 어두운 길
모범 답안 - 어두운 길

0개의 댓글