본문 바로가기

알고리즘/백준

[백준]1717 집합의 표현(Python)

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

 

1717번: 집합의 표현

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

www.acmicpc.net

 

문제 접근

 

https://www.youtube.com/watch?v=AMByrd53PHM

 

위의 강의를 듣고 함수를 구성하였다.

 

1) 찾기 연산(find_parent):

특정한 원소의 부모 원소를 찾는 연산

만약 두 원소가 동일한 부모 원소를 갖는다면 두 원소는 같은 집합에 소속

 

2) 합집합 연산(union_parent):

두 원소가 포함된 집합을 하나의 집합으로 합치는 연산

더 작은 부모 원소로 합치기 

 

코드
import sys

sys.setrecursionlimit(1000000)  # 재귀 깊이 제한 늘리기
input = sys.stdin.readline

n, m = map(int, input().split())
parent = [i for i in range(n + 1)]  # 자기 자신을 부모로 갖는 n + 1개 집합


# 찾기 연산(같은 집합에 속하는지 확인)
def find_parent(x):
    if parent[x] != x:
        parent[x] = find_parent(parent[x])
    return parent[x]


# 합집합 연산(두 집합을 합치기 위한 함수)
def union_parent(a, b):
    a = find_parent(a)
    b = find_parent(b)
    if a < b:  # 값이 더 작은 쪽을 부모로 두기
        parent[b] = a
    else:
        parent[a] = b


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

 

문제 회고

 

재귀 함수에 대한 이해가 필요함을 다시금 느꼈다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준]1976 여행가자(Python)  (0) 2024.01.22
[백준]4195 친구 네트워크(Python)  (0) 2024.01.21
[백준]1916 최소 비용 구하기(Python)  (0) 2024.01.19
[백준]1865 웜홀(Python)  (0) 2024.01.18
[백준]1956 운동(Python)  (2) 2024.01.17