풀이
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
def solution(n, costs):
answer = 0
edges = []
parent = [0] * (n + 1)
for i in range(1, n + 1):
parent[i] = i
for a,b,cost in costs:
edges.append((cost,a,b))
edges.sort()
for edge in edges:
cost, a, b = edge
if find_parent(parent, a) != find_parent(parent, b):
union_parent(parent, a, b)
answer += cost
return answer
- 최소 신장 트리 알고리즘 = 크루스칼 알고리즘
def find_parent:
부모 노드를 찾는 함수
- 재귀적으로 호출
- 부모 노드가 자기 자신이 아니라면 부모 노드를 찾을 때까지 재귀적으로 호출
def union_parent:
사이클이 발생하지 않는(부모 노드가 다른) 노드를 최소 신장 트리에 포함시키는 함수
- a의 부모 노드와 b의 부모 노드 중 더 큰 값으로 부모 노드를 바꾸면서 a,b의 부모 노드를 같게 만든다.
def solution(n, costs):
- 부모 테이블을 0으로 정의한 뒤, 자기 자신으로 초기화
(cost,a,b)
순으로 edges
에 추가한 뒤, 간선을 비용 순으로 정렬
- 간선을 하나씩 확인하면서 사이클이 도는지 (= 부모 노드가 같은지) 확인한다.
- a의 부모노드와 b의 부모노드가 다르다면 (= 사이클이 발생하지 않는 경우) 부모 노드를 바꾸는
union_parent
수행