-
백준 4195 친구 네트워크(python, Union-Find)Algorithm/BOJ(백준) 2021. 8. 27. 17:00
* 문제 링크: https://www.acmicpc.net/problem/4195
4195번: 친구 네트워크
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진
www.acmicpc.net
* 해결 방법: Union-find
1. 사람 수를 100,000명까지 입력 가능하지만, 완탐으로 풀면 시간초과. 따라서, 집합을 이용하여 해결
2. 비어있는 dict 하나를 구성
3. 입력받은 name1과 name2가 dict에 존재하지 않으면, 각 name을 key값으로 잡고 0번 인덱스부터 차근차근 저장
4. 집합을 구성할 arr=[-1] * (2*n+2) #사람 수가 2명씩 입력되기 때문에 *2를 했음
5. union(dict[name1], dict[name2]) 진행 후, 마지막에 연산된 arr[a] 값 리턴
import sys
def find(x):
if arr[x] < 0:
return x
arr[x] = find(arr[x])
return arr[x]
def union(x,y):
a, b = find(x), find(y)
if (a!=b):
arr[a] += arr[b]
arr[b] = a
return arr[a]
test_case = int(input())
for test in range(test_case):
n = int(input())
names = {} #이름
cnt = 0 # 사람 수
arr = [-1] * (2*n+2)
for i in range(n):
f1, f2 = sys.stdin.readline().rstrip().split()
if f1 not in names:
names[f1] = cnt
cnt += 1
if f2 not in names:
names[f2] = cnt
cnt += 1
print(-1 * union(names[f1], names[f2]))'Algorithm > BOJ(백준)' 카테고리의 다른 글
백준 1717 집합의 표현(python, Union-Find) (0) 2021.08.26 백준 5568 카드 놓기(python, permutations) (0) 2021.08.26 백준 10814 나이순 정렬(python, lambda 사용) (0) 2021.08.26 백준 1593 문자 해독(python, 슬라이딩 윈도우) (0) 2021.08.26 백준 10845 큐 (0) 2019.09.08