728x90
해당 문제는 서로소 집합 문제로 해결할 수 있습니다.
왼쪽 친구의 부모로 계속 합치면서 현재 친구상황을 파이썬의 set자료구조에서 union을 통하여 친구네트워크를 업데이트 합니다.
import sys
input = sys.stdin.readline
def find(name):
if parent[name] == name:
return parent[name]
else:
parent[name] = find(parent[name])
return parent[name]
def union(name1, name2):
p1 = find(name1)
p2 = find(name2)
if p1 == p2:
return
parentset[p1] = parentset[p1].union(parentset[p2])
parent[p2] = p1
T = int(input())
for _ in range(T):
N = int(input())
parent = dict()
parentset = dict()
for _ in range(N):
a, b = map(str, input().split())
if a not in parent:
parent[a] = a
parentset[a] = set()
parentset[a].add(a)
if b not in parent:
parent[b] = b
parentset[b] = set()
parentset[b].add(b)
union(a, b)
p = find(a)
print(len(parentset[p]))
<aside> 💡 실제로 친구를 저장하지 않고 개수를 업데이트 함으로서 메모리최적화와 속도를 개선 할 수 있습니다. 만약 친구리스트를 출력해야하는경우는 위의 문제가 알맞을 수 있습니다.
</aside>
import sys
input = sys.stdin.readline
T = int(input())
def find(a):
if parent[a] != a:
parent[a] = find(parent[a])
return parent[a]
else:
return parent[a]
def union(a, b):
parent[b] = a
friend[a] += friend[b]
for _ in range(T):
F = int(input())
friend = dict()
parent = dict()
for i in range(F):
friend1, friend2 = map(str, input().split())
if friend1 not in parent:
parent[friend1] = friend1
friend[friend1] = 1
if friend2 not in parent:
parent[friend2] = friend2
friend[friend2] = 1
v1 = find(friend1)
v2 = find(friend2)
if v1 != v2:
union(v1, v2)
print(friend[find(friend1)])
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17070번 : 파이프 옮기기1 (0) | 2023.10.20 |
---|---|
[백준] 2357번 : 최솟값과 최댓값 (0) | 2023.10.20 |
[백준] 2042번 : 구간합구하기 (0) | 2023.10.20 |
[백준] 1935번 : 후위 표기식2 (0) | 2023.10.20 |
[백준] 18428번 : 감시 피하기 (0) | 2023.10.20 |