728x90
문제
초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 $n$, $m$이 주어진다. $m$은 입력으로 주어지는 연산의 개수이다. 다음 $m$개의 줄에는 각각의 연산이 주어진다. 합집합은 $0$ $a$ $b$의 형태로 입력이 주어진다. 이는 $a$가 포함되어 있는 집합과, $b$가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 $1$ $a$ $b$의 형태로 입력이 주어진다. 이는 $a$와 $b$가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
출력
1로 시작하는 입력에 대해서 $a$와 $b$가 같은 집합에 포함되어 있으면 "YES" 또는 "yes"를, 그렇지 않다면 "NO" 또는 "no"를 한 줄에 하나씩 출력한다.
예제


풀이
# 1. 연산의 맨 앞이 0인 경우에는 두 원소를 같은 집합에 넣기
# 2. 연산의 맨 앞이 1인 경우에는 같은 집합에 있는지를 확인하기
def find_parent(x):
# 초기 상태에서 find_parent(x)하면 x값이 그대로 나와야 함
# 루트 노드를 찾아갈 수 있도록 재귀적으로 작성
if data[x] != x:
data[x] = find_parent(data[x])
return data[x]
def union_subset(x,y):
# x와 y원소를 받아서 그 두 개를 합치기
# x가 속한 집합과 y가 속한 집합을 찾아서 그 둘을 합치는 것
x = find_parent(x)
y = find_parent(y)
# 만약 둘이 속한 집합이 다르면 합쳐주기 -> 같은 부모노드를 가지고 있다고 처리
if x != y:
data[x] = y
# 시간초과 방지를 위한 처리
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)
# n+1개의 집합이 존재하므로 range(n+1)
# 현재 인덱스에 저장된 값은 자신의 부모노드인 셈
n,m = map(int,input().split())
data = [i for i in range(n+1)]
for _ in range(m):
part, x, y = map(int,input().split())
if part == 0:
union_subset(x,y)
if part == 1:
find_x = find_parent(x)
find_y = find_parent(y)
if find_x != find_y :
print("NO")
if find_x == find_y:
print("YES")
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
| [백준 Python] 2252번 줄 세우기 (0) | 2023.07.06 |
|---|---|
| [백준 Python] 9372번 상근이의 여행 (0) | 2023.07.05 |
| [백준 Python] 2343번 기타레슨 (0) | 2023.06.23 |
| [백준 Python] 2512번 예산 (0) | 2023.06.22 |