// education

18. 트리 심화 - 최소 공통 조상(LCA: Lowest Common Ancestor) 및 희소 배열(Sparse Table)

트리 구조에서 두 정점의 가장 가까운 공통 조상을 효율적으로 탐색하는 최소 공통 조상(LCA: Lowest Common Ancestor) 알고리즘을 학습합니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

import sys
sys.setrecursionlimit(10**5)

LOG = 21  # 2^20 > 1,000,000 대용량 트리를 위한 상한

def get_lca(u: int, v: int, depth: list, parent: list) -> int:
    """희소 배열(Sparse Table)을 이용한 O(log N) LCA 최소 공통 조상 탐색"""
    # 1. v의 깊이가 더 깊도록 정렬
    if depth[u] < depth[v]:
        u, v = v, u
        
    # 2. 두 노드의 깊이(depth)를 동일하게 맞춤 (2^i 만큼 껑충 점프)
    for i in range(LOG - 1, -1, -1):
        if depth[u] - depth[v] >= (1 << i):
            u = parent[u][i]
            
    # 깊이를 맞췄을 때 두 노드가 같으면 그 노드가 곧 LCA
    if u == v:
        return u
        
    # 3. 공통 조상 직전까지 2^i 단위로 올라감
    for i in range(LOG - 1, -1, -1):
        if parent[u][i] != parent[v][i]:
            u = parent[u][i]
            v = parent[v][i]
            
    # 바로 위의 부모(parent[u][0])가 최종 LCA
    return parent[u][0]

파이썬 소스 코드 핵심 포인트 해설

  1. parent[node][k]: $2^k$ 번째 부모를 미리 계산해 두는 희소 배열(Sparse Table) 기법으로 $O(log N)$ 시간에 공통 조상을 탐색합니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

18. 트리 심화 - 최소 공통 조상(LCA: Lowest Common Ancestor) 및 희소 배열(Sparse Table) 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전17. 문자열 검색 알고리즘 - KMP(Knuth-Morris-Pratt $O(N+M)$)와 라빈-카프(Rabin-Karp) 다음 →19. 구간 쿼리 자료구조 - 세그먼트 트리(Segment Tree) 및 느리게 갱신되는 세그먼트 트리