[백준] 2887번 행성 터널

JaeYeop·2022년 5월 4일
0

백준

목록 보기
18/19

[문제]

https://www.acmicpc.net/problem/2887

[코드]

import sys
input = sys.stdin.readline

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

def union_parent(parent, x, y):
    a = find_parent(parent, x)
    b = find_parent(parent, y)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

n = int(input())
star = []
for i in range(n):
    x, y, z = map(int, input().split())
    star.append([x, y, z, i])
parent = []
for i in range(n):
    parent.append(i)

graph = []
for i in range(3):
    star.sort(key=lambda x:x[i])
    for j in range(n - 1):
        graph.append([abs(star[j][i] - star[j + 1][i]), star[j][3], star[j + 1][3]])

graph.sort()
result = 0
for i in graph:
    if find_parent(parent, i[1]) != find_parent(parent, i[2]):
        union_parent(parent, i[1], i[2])
        result += i[0]

print(result)

[풀이]

이 문제는 크루스칼 알고리즘 이용해서 풀 수 있다

하지만 모든 노드에서 다른 노드로의 간선을 구할 시에 최대 100000 * (100000 - 1) / 2개의 간선이 구해진다

이를 줄이고자 노드대 노드가 아닌 x대x, y대y, z대z 처럼 각 좌표값을 정렬해서 계산을 한다. 그러면 원래 N (N-1) / 2 개의 크기에서 (N - 1) 3개로 간선을 줄일 수 있다

이렇게 문제를 풀면 메모리 초과가 뜨지 않을 것이다

profile
이게 왜 틀리지... (나의 메모용 블로그)

0개의 댓글