[백준] 1717번 집합의 표현 / 파이썬 Python (union find)

2025. 2. 9. 23:06·코딩테스트 준비/문제풀이

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

 

 

백준 1717번 집합의 표현은 유니온 파인드(union find) 알고리즘을 확실히 알게 해주는 문제였다.

 

문제

 

 

설명

 

문제 1717번 예제로 유니온 파인드에 대해 설명하자면,

 

1)  대표 노드를 저장하는 1차원 리스트가 필요하며 처음에는 연결되어 있지 않으므로

자신의 인덱스 값으로 초기화한다.

 

 

2) 2개의 노드 각각의 대표 노드를 찾아 union 연산으로 연결한다.

예를 들어 두 번째 줄 입력을 받아서 0일 때 union(1,3) 을 해주면 arr[3] = 1로 값이 변경된다.

이때, 작은 값을 대표 노드로 본다.

 

유니온 파인드 알고리즘에서 유의할 것은 입력 6번째 줄 union(3,7) 인 경우다.

5번째 줄까지 모두 진행되었다고 가정해보면 union(7,6)이 실행되었으므로 arr[7] = 6 이다.

 

3, 7번의 각 대표 노드를 찾은 후, 그 대표 노드끼리 연결해야 한다.

3번의 대표 노드는 1, 7번의 대표 노드는 6 이므로 arr[7] = 1 이 아닌 arr[6] = 1 로 변경해준다.

 

 

 

3) find 연산은 자신의 대표 노드를 찾아주는 역할이다.

index와 value가 같을 때까지 찾아야 하므로 재귀 함수로 구현한다.

 

 

코드
import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline

n, m = map(int, input().split())
arr = [i for i in range(n+1)]

def Find(f):				# 대표 노드 찾기
    if arr[f] != f:
        arr[f] = Find(arr[f])	# 재귀로 구현
    return arr[f]

def Union(x, y):			# 대표 노드끼리 합치는 union 연산
    idx = Find(x)
    idx2 = Find(y)
    if idx < idx2:			# 작은 값을 대표 노드로
        arr[idx2] = idx
    else:
        arr[idx] = idx2

for _ in range(m):
    flag, a, b = map(int, input().split())
    if flag == 0:
        Union(a, b)
    else:
        if Find(a) != Find(b):
            print("NO")
        else:
            print("YES")
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 준비 > 문제풀이' 카테고리의 다른 글

[백준] 1850번 최대공약수 파이썬 Python / 유클리드 호제법 풀이  (0) 2025.02.14
[백준] 1012번 유기농 배추 | 파이썬 Python 너비 우선 탐색(BFS)으로 구현  (0) 2025.02.11
[백준] 1931번 회의실 배정 | 파이썬 Python 그리디 알고리즘 구현  (0) 2025.02.10
[백준] 2178번 미로 탐색 / 파이썬 python 너비 우선 탐색(bfs) 구현  (0) 2025.02.10
[백준] 1753번 최단경로 / 파이썬 python 다익스트라 알고리즘 구현  (0) 2025.02.10
'코딩테스트 준비/문제풀이' 카테고리의 다른 글
  • [백준] 1012번 유기농 배추 | 파이썬 Python 너비 우선 탐색(BFS)으로 구현
  • [백준] 1931번 회의실 배정 | 파이썬 Python 그리디 알고리즘 구현
  • [백준] 2178번 미로 탐색 / 파이썬 python 너비 우선 탐색(bfs) 구현
  • [백준] 1753번 최단경로 / 파이썬 python 다익스트라 알고리즘 구현
하이야니
하이야니
또 취준..!
  • 하이야니
    하이야니's 스케치
    하이야니
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩테스트 준비
        • 알고리즘 개념
        • 문제풀이
      • 파이썬
      • 자바
      • 리눅스
      • C언어
      • 여행
        • 국내
        • 해외
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    너비우선탐색파이썬
    거리두기확인하기파이썬
    유클리드호제법최대공약수
    백준bfs
    벨만포드
    벨만포드다익스트라
    벨만포드음수사이클
    유클리드호제법파이썬
    프로그래머스pccp
    프로그래머스pccp기출문제
    백준유클리드호제법
    프로그래머스파이썬
    프로그래머스거리두기
    프로그래머스거리두기확인하기
    다익스트라
    pccp기출문제
    프로그래머스코딩테스트
    프로그래머스거리두기확인하기파이썬
    거리두기확인하기풀이
    pccp기출문제1번
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
하이야니
[백준] 1717번 집합의 표현 / 파이썬 Python (union find)
상단으로

티스토리툴바