// education

19. 구간 쿼리 자료구조 - 세그먼트 트리(Segment Tree) 및 느리게 갱신되는 세그먼트 트리

배열의 구간 합, 최댓값, 최솟값 쿼리 및 특정 원소의 변경을 $O(log N)$ 시간에 처리하는 **세그먼트 트리(Segment Tree)**와 Lazy Propagation을 다룹니다.


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

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

class SegmentTree:
    """O(log N) 구간합 쿼리 세그먼트 트리"""
    def __init__(self, arr):
        self.n = len(arr)
        # 세그먼트 트리의 노드 수: 보통 4 * N 크기 할당
        self.tree = [0] * (4 * self.n)
        self.build(arr, 1, 0, self.n - 1)
        
    def build(self, arr, node, start, end):
        """세그먼트 트리 재귀적 구축"""
        if start == end:
            self.tree[node] = arr[start]  # 리프 노드
            return
        mid = (start + end) // 2
        self.build(arr, node * 2, start, mid)       # 왼쪽 자식
        self.build(arr, node * 2 + 1, mid + 1, end) # 오른쪽 자식
        self.tree[node] = self.tree[node * 2] + self.tree[node * 2 + 1]  # 자식들의 합
        
    def query(self, node, start, end, l, r):
        """구간 [l, r] 의 합 쿼리 (O(log N))"""
        if r < start or end < l:  # 범위를 벗어난 경우
            return 0
        if l <= start and end <= r:  # 완전히 포함되는 경우
            return self.tree[node]
        mid = (start + end) // 2
        return self.query(node * 2, start, mid, l, r) + self.query(node * 2 + 1, mid + 1, end, l, r)

if __name__ == "__main__":
    st = SegmentTree([1, 2, 3, 4, 5])
    print("구간합 (인덱스 1~3):", st.query(1, 0, 4, 1, 3))

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

  1. self.tree[node * 2] + self.tree[node * 2 + 1]: 자식 노드의 합을 부모 노드에 축적하는 완전 이진 트리 방식 구현 주석 해설입니다.

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

19. 구간 쿼리 자료구조 - 세그먼트 트리(Segment Tree) 및 느리게 갱신되는 세그먼트 트리 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

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

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

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

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

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

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

← 이전18. 트리 심화 - 최소 공통 조상(LCA: Lowest Common Ancestor) 및 희소 배열(Sparse Table) 다음 →20. 비트마스킹(Bitmasking)과 외판원 순회 문제(TSP: Traveling Salesperson Problem)