문제 출처 : www.acmicpc.net/problem/2887
2887번: 행성 터널
첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -109보다 크거나 같고, 109보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이
www.acmicpc.net
문제 해석 : 행성 터널을 건설하는데 N개 행성에 대해서 N-1개의 터널을 최소 비용으로 구하는 문제이다.
문제 풀이 : 모든 경로를 생성하고 문제를 풀이하고자 한다면 메모리 초과 또는 시간 복잡도에서 초과가 날 것이다. 따라서 x,y,z에 대해서 정렬을 실행하고 각각 사이의 거리를 저장한 다음 이를 간선으로 취급해서 MST를 실행하면 된다.
-> 중복 되는 경우를 제외하기 위해서 임의의 행성번호를 추가하여 한 행성에 대해서 1개의 최소간선이 되도록 한다.
풀이 코드
def find_parent(parent, x):
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
N = int(input())
parent = [0] * (N + 1)
result = 0
route = []
for i in range(1, N + 1):
parent[i] = i
arr1 = []
arr2 = []
arr3 = []
for i in range(1, N+1):
x, y, z = map(int, input().split())
arr1.append((x,i))
arr2.append((y,i))
arr3.append((z,i))
arr1.sort()
arr2.sort()
arr3.sort()
for i in range(N-1):
route.append((abs(arr1[i+1][0] - arr1[i][0]), arr1[i][1], arr1[i+1][1]))
route.append((abs(arr2[i+1][0] - arr2[i][0]), arr2[i][1], arr2[i+1][1]))
route.append((abs(arr3[i+1][0] - arr3[i][0]), arr3[i][1], arr3[i+1][1]))
route.sort()
for edge in route:
cost, x, y = edge
if find_parent(parent, x) != find_parent(parent, y):
union_parent(parent, x, y)
result += cost
print(result)
author : donghak park
contact : donghark03@naver.com
## 문제의 저작권은 백준 알고리즘 사이트에 있습니다. 혹시 문제가 되는 부분이 있으면 연락 바랍니다.
'📊알고리즘, 문제풀이 > 📈문제풀이 (PS)' 카테고리의 다른 글
[알고리즘][Python] 백준 1676 팩토리얼 0의 개수 문제 풀이 (0) | 2021.01.09 |
---|---|
[알고리즘][Python] 백준 1620 나는야 포켓몬 마스터 이다솜 문제 풀이 (0) | 2021.01.09 |
[알고리즘][Python] 백준 1541 잃어버린 괄호 문제 풀이 (0) | 2021.01.08 |
[알고리즘][Python] 백준 1389 케빈 베이컨의 6단계 법칙 문제 풀이 (0) | 2021.01.08 |
[알고리즘][Python] 백준 1260 DFS와 BFS 문제 풀이 (0) | 2021.01.08 |