코딩하는 해맑은 거북이

[Python] 집합의 표현 - 백준 본문

코딩테스트

[Python] 집합의 표현 - 백준

#CJE 2023. 8. 24.
해당 글은 백준 1717번 문제 '집합의 표현'을 다룬다.

문제

https://www.acmicpc.net/problem/1717

 

1717번: 집합의 표현

초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작

www.acmicpc.net

 

설명

해당 문제는 그래프의 유니온 파인드 해결법으로 풀 수 있다.

1. N+1 개의 노드에 대해 자기자신으로 부모를 초기화 해준다.

2. union시 더 작은 값으로 부모를 지정해준다.

3. 같은 집합인지 판별하기 위해, 부모를 찾아 비교해준다.

또한, 주의할 점은 재귀한계를 설정해주지 않았더니 시간초과가 발생했었다.

 

 

코드

import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline

n, m = map(int, input().split())

parent = [0]*(n+1)
for i in range(n+1):
    parent[i] = i

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

for _ in range(m):
    t, a, b = map(int, input().split())
    if t == 0:
        union_parent(parent, a, b)
    else:
        if (find_parent(parent, a) == find_parent(parent, b)):
            print("YES")
        else:
            print("NO")

     

 

 

Comments