ericagong / algorithm_solving

2 stars 0 forks source link

[크루스칼] 행성터널 #33

Open ericagong opened 1 year ago

ericagong commented 1 year ago

⭐ 성찰

  1. 크루스칼 O(ElogE)에서 시간 복잡도가 초과하는 경우, 전체 고려해야하는 간선 수 E를 어떻게 줄일 수 있을지 고민해야함.

❓ 문제 상황

행성터널

👨‍💻 문제 해결: 최소 신장 트리

⏳ 시간복잡도

✅ 1차 풀이: 크루스칼

  1. x, y, z 축 별로 별동의 리스트에 저장한 뒤 정렬 수행. 정렬을 위해 반드시 (비용, 노드 번호) 순으로 입력.
  2. x, y, z 축의 인접한 두 노드 사이의 비용을 계산하여 edges에 추가
  3. edges를 정렬
  4. 크루스칼 진행
    
    import sys

input = sys.stdin.readline n = int(input()) edges = [] result = 0 parents = [0] * (n+1)

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

def union_parent(p, a, b): a = find_parent(p, a) b = find_parent(p, b) if a < b: p[b] = a else: p[a] = b

for i in range(1, n+1): parents[i] = i

x, y, z 축 별로 저장

xs = [] ys = [] zs = [] for i in range(1, n+1): x, y, z = map(int, input().split()) xs.append((x, i)) ys.append((y, i)) zs.append((z, i))

x, y, z 축 별로 정렬

xs.sort() ys.sort() zs.sort()

x, y, z 축 별로 인접한 두 지점 사이의 간선만 edges에 추가

for i in range(n-1): edges.append((abs(xs[i+1][0] - xs[i][0]), xs[i][1], xs[i+1][1])) edges.append((abs(ys[i+1][0] - ys[i][0]), ys[i][1], ys[i+1][1])) edges.append((abs(zs[i+1][0] - zs[i][0]), zs[i][1], zs[i+1][1]))

edges.sort()

for edge in edges: cost, a, b = edge if find_parent(parents, a) != find_parent(parents, b): union_parent(parents, a, b) result += cost

print(result)