본문 바로가기
코딩테스트 파이썬/백준

사이클 게임 ( 20040 번 )

by 세용용용용 2025. 6. 29.

20040번: 사이클 게임

 

🧠 알고리즘

m개의 간선 정보를 입력받으며 루프를 돔
두 노드가 이미 같은 집합에 속하면 → 사이클 발생 → 현재 턴 번호(answer) 반환, 아니라면 두 노드를 유니온 수행...
루프가 끝날 때까지 사이클이 없으면 0을 반환

 

🧾 코드

import sys

def _find_pt(num):
    if num != pt_list[num]:
        pt_list[num] = _find_pt(pt_list[num])
    
    return pt_list[num]


def _union(a, b):
    pt_a, pt_b = _find_pt(a), _find_pt(b)
    if pt_a > pt_b:
        pt_list[pt_a] = pt_b
    else:
        pt_list[pt_b] = pt_a


def _main(n, m):
    answer = 0
    for _ in range(m):
        answer += 1
        a, b = map(int, sys.stdin.readline().rstrip().split())
        if _find_pt(a) == _find_pt(b):
            return answer

        _union(a, b)        

    return 0

n, m = map(int, sys.stdin.readline().rstrip().split())
pt_list = [i for i in range(n)]
print(_main(n, m))

 

⏱️ 시간 복잡도

m 만큼 반복하므로 : 선형 시간 복잡도
    _find() : 경로 압축으로 거의 상수 시간
    _union() : 경로 압축으로 거의 상수 시간

해당 알고리즘 시간 복잡도 : 선형 시간 복잡도 ( O(n) )

 

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

소수의 연속합 ( 1644 번 )  (0) 2025.06.29
수 나누기 게임 ( 27172 번 )  (0) 2025.06.29
ACM Craft ( 1005번 )  (0) 2025.06.19
RGB거리 2 ( 17404 번 )  (0) 2025.06.13
팰린드롬? ( 10942 번 )  (0) 2025.06.13