본문 바로가기
코딩 테스트/문제 풀기

[백준] 행성 터널

by hazel_ 2021. 3. 26.

www.acmicpc.net/problem/2887

 

2887번: 행성 터널

첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -109보다 크거나 같고, 109보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이

www.acmicpc.net

 

import sys

def find_parent(i):
    if parent[i]!=i:
        parent[i]=find_parent(parent[i])
    return parent[i]

def union(a,b):
    a=find_parent(a)
    b=find_parent(b)

    if a==b:
        return False

    if a<b:
        parent[b]=a
    else:
        parent[a]=b
    return True

def kruskal(edges):
    result=0

    for cost,a,b in edges:
        if union(a,b):
            result+=cost


    return result

input=sys.stdin.readline

n=int(input())

parent=[i for i in range(n)]

l_x=[]
l_y=[]
l_z=[]

for i in range(n):
    x,y,z=map(int, input().split())
    l_x.append((x, i))
    l_y.append((y, i))
    l_z.append((z, i))

l_x.sort()
l_y.sort()
l_z.sort()

edges=[]

for i in range(n-1):
    edges.append((abs(l_x[i][0]-l_x[i+1][0]), l_x[i][1], l_x[i+1][1]))
    edges.append((abs(l_y[i][0]-l_y[i+1][0]), l_y[i][1], l_y[i+1][1]))
    edges.append((abs(l_z[i][0]-l_z[i+1][0]), l_z[i][1], l_z[i+1][1]))

edges.sort()

result = kruskal(edges)
print(result)

댓글