프로그래머스 고득점kit/그래프

Union-Find Algorithm (유니온 파인드 알고리즘) 탬플릿 코드

코딩질문자 2024. 7. 21. 18:29
728x90

 

Union-Find Algorithm (유니온 파인드 알고리즘) 탬플릿 코드

n, m = map(int, input().split())

parent = [0] * (n + 1)
for i in range(n + 1):
    parent[i] = i


def find(node):
    if node != parent[node]:
        parent[node] = find(parent[node])  
    return parent[node]


def union(a, b, parent):
    pa = find(a)
    pb = find(b)

    if pa == pb:
        return
    
    if a > b:
        parent[pa] = pb
        
    else:
        parent[pb] = pa
        
for _ in range(m):
    u, v = map(int, input().split())
    union(u, v, parent)


for i in range(n + 1):
    find(i)

numbers = []
for i in range(len(parent)):
    if parent[i] not in numbers:
        numbers.append(parent[i])

print(len(numbers) - 1)

 

랭크 개념 추가

 

void union(int x, int y)
     xRoot = find(x);
     yRoot = find(y);
     if xRoot == yRroot
         return
 
     if (rank[xRoot] >= rank[yRoot])
         parent[yRoot] = xRoot;
     else
         parent[xRoot] = yRoot;
 
     if (rank[xRoot] == rank[yRoot])
         rank[yRoot] = rank[xRroot] + 1

 

 

종합 코드 ( 주석 추가)

n, m = map(int, input().split())

parent = [0] * (n + 1)
rank = [0] * (n + 1)  # 각 노드의 랭크(트리의 높이)를 저장하는 배열

# 초기화: 각 노드의 부모를 자기 자신으로 설정
for i in range(n + 1):
    parent[i] = i

def find(node):
    # 경로 압축: 재귀적으로 부모를 찾아가며 부모를 직접 최상위 부모로 변경
    if node != parent[node]:
        parent[node] = find(parent[node])  
    return parent[node]

def union(a, b):
    pa = find(a)  # a의 최상위 부모를 찾음
    pb = find(b)  # b의 최상위 부모를 찾음

    # 이미 같은 집합에 속해 있으면 아무 작업도 하지 않음
    if pa == pb:
        return
    
    # 랭크를 이용한 유니온: 항상 랭크가 낮은 트리를 랭크가 높은 트리에 연결
    if rank[pa] > rank[pb]:
        parent[pb] = pa
    elif rank[pa] < rank[pb]:
        parent[pa] = pb
    else:
        parent[pb] = pa
        rank[pa] += 1  # 랭크가 같은 경우 한쪽의 랭크를 증가시킴
728x90