BAEKJOON/알고리즘

[BOJ] 1717번 : 집합의 표현

말하는 알감자 2023. 12. 30. 15:18

🔒 문제

⌨ 입력

🖨 출력

📍 제한

📚 예제

📌 풀이

이 문제는 union-find의 기본 문제가 아닐까 싶다.
그냥 보자마자 어,, union-find다 라는 생각이 들었다.

문제를 푸는 것 자체는 안어려웠지만, error가 많이 나서 보니까

1. Recursive error

이 오류는 Python이 정한 최대 재귀 깊이보다 재귀의 깊이가 더 깊어져서 발생한다.

sys.setrecursionlimit(10**6)

을 사용해서 Python이 정한 최대 재귀 깊이를 변경해서 풀어준다.

2. memory 초과

이건 pypy로 했더니 발생했다.
해결법은 딱히 찾지 못했다.

3. 시간초과

root 함수를 짤 때 처음엔 root를 찾기만 했지, 찾으면서 root값들을 변경해주는 것이 없었다.
그래서 root를 찾을때마다 연산 수 가 많아져서 발생한 오류이다.
따라서 root를 찾을 때, root 값들을 갱신해주니까 오류가 사라졌다.

# 수정 전 코드
def root(t):
    if Set[t] == t:
        return t
    return root(Set[t])
# 수정 후 코드
def root(t):
    if Set[t] == t:
        return t
    # 시간초과 안뜨려면 root 찾을 때 root 바로바로 업데이트 해서 tree 깊이 낮추기
    r = root(Set[t])
    Set[t] = r
    return Set[t]

🔑 python 코드

# 집합의 표현
import sys
sys.setrecursionlimit(10**6) # 파이썬 Recursion Error 피하려고
input = sys.stdin.readline
n, m = map(int, input().split())
Set = [i for i in range(n + 1)]

def root(t):
    if Set[t] == t:
        return t
    # 시간초과 안뜨려면 root 찾을 때 root 바로바로 업데이트 해서 tree 깊이 낮추기
    r = root(Set[t])
    Set[t] = r
    return Set[t]

def union(a, b):
    r1 = root(a)
    r2 = root(b)

    if r1 == r2:
        return
    elif r1 > r2:
        Set[r1] = r2
    elif r2 > r1:
        Set[r2] = r1

for _ in range(m):
    op, a, b = map(int, input().split())
    if op == 0: # 합집합
        union(a, b)
    else: # 같은 집합인지 확인하기
        if(root(a) == root(b)):
            print("yes")
        else:
            print("no")

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

[BOJ] 2667번 : 단지 번호 붙이기  (1) 2024.01.02
[BOJ] 11725번 : 트리의 부모 찾기  (1) 2024.01.01
[BOJ] 1461번 : 도서관  (1) 2023.12.30
[BOJ] 1010번 : 다리 놓기  (1) 2023.12.27
[BOJ] 10775번 : 공항  (0) 2023.03.01