hash
union-find
union(x, y)
: 합하기find(x)
: 찾기parent
는 각 학생들의 최상위 부모를 담은 dict이다. 즉 parent dict의 key는 각 학생들의 이름, value는 각 학생들의 최상위 부모이다.number
은 각 학생 노드가 가지고 있는 하위 노드의 개수를 담은 dict이다. 즉 number dict의 key는 각 학생들의 이름, value는 각 학생 노드의 하위 노드의 개수이다.union(f1, f2)
: f2가 f1을 가리키도록 합치는 연산이다. 즉 f2는 f1에 연결된 하위 노드이다.find(item)
: item의 root(최상위 부모)를 찾아서 반환하는 함수이다. Fred Barney / Barney Betty / Betty Wilma
를 입력하는 경우Fred Barney, Betty Wilma, Barney Betty
를 입력하는 경우def find(item):
if item == parent[item]:
return item
else:
p = find(parent[item])
parent[item] = p
return parent[item]
def union(f1, f2): # f2의 부모는 f1
f1 = find(f1)
f2 = find(f2)
if f1 != f2: # 이거 안해주면 틀리네...
parent[f2] = f1
number[f1] += number[f2]
test_case = int(input())
for _ in range(test_case):
parent = {} # parent의 key는 이름, value는 최상위 부모
number = {} # number의 key는 이름, value는 하위 노드 개수
f = int(input())
for _ in range(f):
f1, f2 = input().split(" ")
if f1 not in parent: # 처음 나왔을 경우 새롭게 추가해줌
parent[f1] = f1
number[f1] = 1
if f2 not in parent: # 처음 나왔을 경우 새롭게 추가해줌
parent[f2] = f2
number[f2] = 1
union(f1, f2)
print(number[find(f1)]) # 최상위 부모에 연결된 노드 개수를 출력한다.
다시 풀어보자 쪼금 어렵다😪