1717번: 집합의 표현
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작
www.acmicpc.net
문제
초기에 개의 집합 {0},{1},{2},…,{n}이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 n, m이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
출력
1로 시작하는 입력에 대해서 a와 b가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
제한
- a, b는 정수
- a와 b는 같을 수도 있다.
코드
import sys
input = sys.stdin.readline
sys.setrecursionlimit(int(1e6))
n, m = map(int, input().split())
parent = [i for i in range(n+1)]
# 루트 찾기
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
# 집합 합치기
def union(a, b):
a = find(a)
b = find(b)
if a == b:
return
if a < b:
parent[b] = a
else:
parent[a] = b
for _ in range(m):
cmd, a, b = map(int, input().split())
if cmd == 0: # 집합 합치기
union(a, b)
else: # 같은 집합인지 확인
print("YES" if find(a) == find(b) else "NO")
분리집합(Disjoint Set, 서로소 집합이라고도 함) 문제로 일반적인 union-find 알고리즘을 이용하여 풀이하였다.
주의할 사항은 재귀 최대 깊이를 설정해주지 않으면 RecusionError가 발생한다.
sys.setrecursionlimit을 이용하여 재귀 최대 깊이를 n의 범위만큼은 설정해주어야 한다.
import sys
sys.setrecursionlimit(int(1e6))
'문제풀이 > 분리집합' 카테고리의 다른 글
[Python/파이썬] 백준 10775번 공항 (0) | 2023.04.05 |
---|---|
[Python/파이썬] 백준 4195번 친구 네트워크 (0) | 2023.04.05 |
[Python/파이썬] 백준 18116번 로봇 조립 (0) | 2023.04.04 |
[Python/파이썬] 백준 16562번 친구비 (0) | 2023.04.04 |
[Python/파이썬] 백준 1976번 여행 가자 (0) | 2023.04.04 |
1717번: 집합의 표현
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작
www.acmicpc.net
문제
초기에 개의 집합 {0},{1},{2},…,{n}이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 n, m이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
출력
1로 시작하는 입력에 대해서 a와 b가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
제한
- a, b는 정수
- a와 b는 같을 수도 있다.
코드
import sys input = sys.stdin.readline sys.setrecursionlimit(int(1e6)) n, m = map(int, input().split()) parent = [i for i in range(n+1)] # 루트 찾기 def find(x): if parent[x] != x: parent[x] = find(parent[x]) return parent[x] # 집합 합치기 def union(a, b): a = find(a) b = find(b) if a == b: return if a < b: parent[b] = a else: parent[a] = b for _ in range(m): cmd, a, b = map(int, input().split()) if cmd == 0: # 집합 합치기 union(a, b) else: # 같은 집합인지 확인 print("YES" if find(a) == find(b) else "NO")
분리집합(Disjoint Set, 서로소 집합이라고도 함) 문제로 일반적인 union-find 알고리즘을 이용하여 풀이하였다.
주의할 사항은 재귀 최대 깊이를 설정해주지 않으면 RecusionError가 발생한다.
sys.setrecursionlimit을 이용하여 재귀 최대 깊이를 n의 범위만큼은 설정해주어야 한다.
import sys sys.setrecursionlimit(int(1e6))
'문제풀이 > 분리집합' 카테고리의 다른 글
[Python/파이썬] 백준 10775번 공항 (0) | 2023.04.05 |
---|---|
[Python/파이썬] 백준 4195번 친구 네트워크 (0) | 2023.04.05 |
[Python/파이썬] 백준 18116번 로봇 조립 (0) | 2023.04.04 |
[Python/파이썬] 백준 16562번 친구비 (0) | 2023.04.04 |
[Python/파이썬] 백준 1976번 여행 가자 (0) | 2023.04.04 |