문제
민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다.
어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.
친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진다. 친구 관계는 두 사용자의 아이디로 이루어져 있으며, 알파벳 대문자 또는 소문자로만 이루어진 길이 20 이하의 문자열이다.
출력
친구 관계가 생길 때마다, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.
코드
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
def find(x, parent):
if parent[x] != x:
parent[x] = find(parent[x], parent)
return parent[x]
def union(a, b, parent, friend):
a = find(a, parent)
b = find(b, parent)
if a == b:
return
if a < b:
parent[b] = a
friend[a] += friend[b]
else:
parent[a] = b
friend[b] += friend[a]
for _ in range(int(input())):
f = int(input())
parent = dict()
friend = dict()
for _ in range(f):
a, b = input().split()
if a not in parent:
parent[a] = a
friend[a] = 1
if b not in parent:
parent[b] = b
friend[b] = 1
union(a, b, parent, friend)
print(friend[find(a, parent)])
이름이 입력으로 들어오므로 딕셔너리를 이용하였다.
사전순으로 앞서는 친구가 부모 노드가 되도록 하여 union-find 알고리즘을 이용하여 풀이하였다. 같은 친구 네트워크에 있다는 건 같은 그래프에 있다는 뜻으로 받아들이면 된다.
'문제풀이 > 분리집합' 카테고리의 다른 글
[Python/파이썬] 백준 17352번 여러분의 다리가 되어 드리겠습니다! (0) | 2023.05.19 |
---|---|
[Python/파이썬] 백준 10775번 공항 (0) | 2023.04.05 |
[Python/파이썬] 백준 18116번 로봇 조립 (0) | 2023.04.04 |
[Python/파이썬] 백준 16562번 친구비 (0) | 2023.04.04 |
[Python/파이썬] 백준 1976번 여행 가자 (0) | 2023.04.04 |