(전공복습) 데이터과학 4. 시각화
차례
유니온 파인드(Union Find, 분리 집합, Disjoint Set) 문제.
다만, 주어지는 입력이 정수가 아니라 국가명으로 되어 있기 때문에 추가 처리가 필요하다.
나는 그냥 parent
를 리스트가 아닌 딕셔너리로 구현하여 넘어갔다.
또한, 유니온을 하는 경우, 두 국가의 루트 노드가 동일한 경우에 예외 처리를 해주어야 한다.
왜냐하면 그 경우 속국이 종주국에 전쟁을 일으킨 경우이기 때문이다.
이후, 종주국들을 사전순으로 출력해야 하는데, 종주국이 여러 번 등장하는 것을 막기 위해 목록을 집합으로 선언해주고, 각 왕국을 순회하며 종주국을 넣어주고, 이를 정렬하여 출력하였다.
#!python
from sys import stdin
input = stdin.readline
# 파인드
def root(node):
if parent[node] != node:
parent[node] = root(parent[node])
return parent[node]
# 유니온
def union(a, b, w):
ra, rb = root(a), root(b)
# a가 종주국, b가 속국인 경우
if ra == rb == a:
parent[ra] = parent[b] = (ra, b)[w-1]
# a가 속국, b가 종주국인 경우
elif ra == rb == b:
parent[a] = parent[rb] = (a, rb)[w-1]
# a가 종주국, b가 종주국인 경우
else:
parent[ra] = parent[rb] = (ra, rb)[w-1]
n, m = map(int, input().split())
kingdoms = []
# parent는 유니온 파인드를 위한 딕셔너리
parent = {}
for _ in range(n):
k = input().rstrip()
kingdoms.append(k)
parent[k] = k
for _ in range(m):
a, b, w = input().split(',')
union(a, b, int(w))
# nations는 종주국 집합
nations = set()
for k in kingdoms:
nations.add(root(k))
print(len(nations))
for e in sorted(nations):
print(e)
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...