티스토리 뷰
https://www.acmicpc.net/problem/1717
1. 접근 방식
- union-find 방식
인덱스를 원소 값으로 갖는, 길이 (n + 1)짜리 리스트를 생성한다. 인덱스가 3이라면, 인덱스 3은 정수, list[3]은 해당 정수가 속한 집합을 의미한다.
따라서 정수 1과 3을 합치고, 정수 4와 5를 합치면 리스트는 위와 같아진다.
이처럼 여러 숫자(노드)가 있고, 두 개의 숫자를 선택하여 두 개가 같은 집합(그래프)에 속하는지 판별하는 알고리즘이 union-find 알고리즘이다.
- 파이썬의 재귀 깊이 제한 조정
import sys
sys.setrecursionlimit(1000000)
정답 코드에 있는 find_parent()라는 메서드의 재귀 깊이는 최대 1,000,000번이다. n의 크기가 최대 백 만이기 때문이다. 그러나 파이썬3 기준 가능한 최대 재귀 깊이는 1,000밖에 되지 않는다. 따라서 위 코드로 재귀 깊이 한도를 변경해야 한다.
2. 정답 코드
import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline
def find_parent(x):
if parents[x] == x:
return x
parents[x] = find_parent(parents[x])
return parents[x]
def union(a, b):
a = find_parent(a)
b = find_parent(b)
if a > b:
parents[a] = b
else:
parents[b] = a
def is_same_set(a, b):
a = find_parent(a)
b = find_parent(b)
return "YES" if a == b else "NO"
# main
n, m = map(int, input().split())
parents = [i for i in range(n + 1)]
for _ in range(m):
op, a, b = map(int, input().split())
if op == 0:
union(a, b)
else:
print(is_same_set(a, b))
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준] 4195번 친구 네트워크 파이썬 풀이 (0) | 2024.01.23 |
---|---|
[백준] 1976번 여행 가자 파이썬 풀이 (0) | 2024.01.20 |
[백준] 14940번 쉬운 최단거리 파이썬 풀이 (0) | 2024.01.19 |
[백준] 1992번 쿼드트리 파이썬 풀이 (0) | 2024.01.17 |
[백준] 7569번 토마토 파이썬 풀이 (0) | 2023.08.24 |