티스토리 뷰

📌서로소 집합

공통 원소가 없는 두 집합

 

📌서로소 집합 자료구조

서로소 부분 집합들로 나누어진 원소들의 데이터를 처리하기 위한 자료구조

union, find 2가지 연산

union: 합집합, 2개의 원소가 포함된 집합을 하나의 집합으로 합치는 연산

find: 찾기, 특정한 원소가 속한 집합이 어떤 집합인지 알려주는 연산

 

구현 시 트리 자료구조 사용

1. union 연산을 확인하여, 서로 연결된 두 노드 A, B를 확인한다.

 - A와 B의 루트 노드 A', B'를 각각 찾는다.

 - A'를 B'의 부모 노드로 설정한다(B'가 A'를 가리키도록 한다.)

2. 모든 union 연산을 처리할 때까지 1번 과정 반복한다.

 

📌기본적인 서로소 집합 알고리즘 소스코드

# 특정 원소가 속한 집합을 찾기
def find_parent(parent, x):
    # 루트 노드가 아니라면, 찾을 때까지 재귀적으로 호출
    if parent[x] != x:
        return find_parent(parent, parent[x])
    return 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


# 노드의 개수, 간선의 개수(union 연산 개수) 입력받기
v, e = map(int, input().split())
parent = [0] * (v + 1)  # 부모 테이블 초기화

# 부모 테이블상에서 부모를 자기 자신으로 초기화
for i in range(1, v + 1):
    parent[i] = i

# union 연산 각각 수행
for i in range(e):
    a, b = map(int, input().split())
    union_parent(parent, a, b)

# 각 원소가 속한 집합 출력
print("각 원소가 속한 집합: ", end="")
for i in range(1, v + 1):
    print(find_parent(parent, i), end=" ")

print()

# 부모 테이블 내용 출력
print("부모 테이블: ", end="")
for i in range(1, v + 1):
    print(parent[i], end=" ")

 

 

📌참고

https://g.co/kgs/eyd5SSd

 

이것이 취업을 위한 코딩 테스트다 with 파이썬

IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년

www.google.com

 

 

'코딩테스트' 카테고리의 다른 글

신장 트리, 크루스칼 알고리즘  (1) 2024.11.11
서로소 집합을 활용한 사이클 판별  (1) 2024.11.10
전보  (3) 2024.11.07
미래 도시  (3) 2024.11.06
최단 경로, 플로이드 워셜 알고리즘  (1) 2024.11.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함