문제 : https://www.acmicpc.net/problem/1717
예제 입력 1
7 8
0 1 3
1 1 7
0 7 6
1 7 1
0 3 7
0 4 2
0 1 1
1 1 1
예제 출력 1
NO
NO
YES
나의 풀이
n, m = map(int, input().split())
parent = [i for i in range(n+1)]
def find(a):
if parent[a] == a:
return a
parent[a] = find(parent[a])
return parent[a]
def union(a,b):
a, b = find(a), find(b)
if a == b: return
parent[a] = b
def check(a,b):
if parent[a] == parent[b] or find(a) == find(b):
return "YES"
return "NO"
for _ in range(m):
num, a, b = map(int, input().split())
if num:
print(check(a, b))
else:
union(a,b)
집합을 사용하여 풀면 시간초과가 발생한다. 따라서 Union-Find 알고리즘을 사용하여 풀어야 한다.
Union-Find 알고리즘은 주로 집합을 합치고, 두 원소가 같은 집합에 속하는지 확인한느 문제를 해결하는데 사용된다.
- Union: 두 개의 원소를 하나의 집합으로 합친다.
- Find: 주어진 원소가 속한 집합의 대표(루트) 원소를 찾는다.
- 경로 압축 (Path Compression): find 연산을 효율적으로 만들어주는 기법으로, 찾은 루트를 부모로 바로 연결하여 이후 연산을 더 빠르게 할 수 있도록 한다.
- 합치기(Union by Rank): 여러 집합을 합칠 때, 더 작은 집합을 더 큰 집합에 합쳐서 트리 구조의 깊이를 최소화하는 기법이다.(이 코드에서는 사용하지 않았지만, 보통 성능 최적화에 유용함)
서로소 집합 알고리즘
서로소 집합 알고리즘 - 서로소 부분 집합들로 나누어진 원소들의 데이터를 처리하기 위한 자료구조 - 서로소: 공통 원소가 없는 두 집합 - union, find 2개의 연산으로 조작 가능 union 연산 (합집합)
seulow-down.tistory.com
'개발 | 프로젝트 > Python' 카테고리의 다른 글
[Python] execute() 함수 / exec()와의 차이 / cursor (0) | 2025.01.20 |
---|---|
[Python] 웹소켓 서버 / 클라이언트 구현 (WebSocket 라이브러리) (1) | 2024.11.27 |