|

펜윅 트리 vs 세그먼트 트리: 코딩테스트에서 무엇이 더 구현하기 쉬울까

펜윅 트리 vs 세그먼트 트리: 코딩테스트에서 무엇이 더 구현하기 쉬울까
둘 다 구간 문제를 다루지만 펜윅은 더 가볍고 세그먼트 트리는 더 일반적인 구조에 가깝다

펜윅 트리와 세그먼트 트리는 코딩테스트에서 같이 언급되다 보니 입문자가 더 헷갈리기 쉬운 조합입니다. 둘 다 구간 합, 업데이트 같은 문제에 나온다고 하니 대체 뭐가 다른지 애매해지고, 결국 둘 다 어렵게 느껴지기도 합니다.

이번 글에서는 두 구조를 정의 나열로 비교하지 않고, 언제는 펜윅이 더 가볍고, 언제는 세그먼트 트리가 더 일반적이고 강한 선택인지 중심으로 설명하겠습니다.

펜윅 트리 핵심 카드
핵심 판단 기준을 먼저 잡는 요약 카드

둘은 왜 같이 자주 나오나

둘 다 배열에 대해 부분합을 빠르게 구하고, 중간 업데이트도 버티게 만들려는 구조입니다. 즉 누적합의 약점인 “업데이트가 잦으면 다시 계산 비용이 크다”는 문제를 해결하려는 점에서 출발이 같습니다.

그래서 코딩테스트에서 구간 합 + 업데이트 문제가 나오면 보통 둘 중 하나를 후보로 생각하게 됩니다.


펜윅 트리는 왜 더 가볍게 느껴질까

펜윅 트리는 binary indexed tree라고도 부르는데, 누적합을 비트 단위 구간으로 쪼개 저장합니다. 각 인덱스가 특정 길이의 부분합을 들고 있어서, prefix sum을 빠르게 합치고 update도 빠르게 전파할 수 있습니다.

세그먼트 트리보다 구현 길이가 짧고, 메모리 구조도 비교적 단순한 편이라 “구간 합 + 점 업데이트” 같은 문제에서는 입문자가 먼저 고려해 보기 좋은 구조입니다.

펜윅 트리 갱신과 조회 흐름 그림
비트 인덱스를 따라 상위 구간으로 이동하는 흐름을 정리한 도식
def update(i, delta):
    while i <= n:
        tree[i] += delta
        i += i & -i

def prefix_sum(i):
    s = 0
    while i > 0:
        s += tree[i]
        i -= i & -i
    return s

입문자가 많이 헷갈리는 부분은 i & -i입니다. 이건 현재 인덱스가 담당하는 구간 크기를 나타내는 비트 패턴이라고 보면 됩니다. 즉 펜윅 트리는 비트 연산으로 상위 구간, 하위 구간을 빠르게 오가도록 설계된 구조입니다.


세그먼트 트리는 왜 더 일반적일까

세그먼트 트리는 배열을 구간 단위로 나눈 트리 구조라서, 합뿐 아니라 최소값, 최대값, 여러 종류의 구간 연산으로 확장하기가 더 자연스럽습니다. 즉 문제 범위가 넓어질수록 세그먼트 트리가 더 일반적인 해법이 됩니다.

반면 펜윅 트리는 더 가볍지만, 다루는 연산 종류 면에서는 세그먼트 트리보다 제한적인 경우가 많습니다. 그래서 둘은 경쟁자라기보다 적용 범위가 조금 다른 도구라고 보는 편이 정확합니다.

펜윅 트리와 세그먼트 트리 비교 카드
구현 난이도와 적용 범위를 비교한 카드

문제에서 어떤 신호가 보이면 무엇을 고를까

  • 구간 합 + 점 업데이트 위주이고 구현을 가볍게 가고 싶다 → 펜윅 트리 우선 고려
  • 최솟값/최댓값/복합 구간 연산까지 확장 가능성이 있다 → 세그먼트 트리 고려
  • 좌표 압축과 함께 큰 인덱스 범위를 다뤄야 한다 → 둘 다 후보가 될 수 있음
  • 누적합만으로 충분한지 먼저 보고, 부족할 때만 둘 중 하나로 올라간다

즉 먼저 누적합으로 충분한지 보고, 그다음 구간 업데이트/구간 질의가 같이 많다면 펜윅 또는 세그트리로 올라가는 식이 자연스럽습니다.


헷갈리는 포인트

  1. 펜윅 트리는 더 짧게 구현되지만 만능은 아니다
  2. 세그먼트 트리는 무겁지만 더 일반적인 구조다
  3. 둘 다 누적합의 확장처럼 볼 수 있지만, 문제 범위가 다르다
  4. 선택 기준은 “어느 쪽이 더 고급인가”가 아니라 “문제가 무엇을 요구하는가”다

누적합 감각은 누적합 글, 더 일반적인 구간 구조는 세그먼트 트리 글과 이어서 보면 훨씬 잘 연결됩니다.


마무리

펜윅 트리와 세그먼트 트리는 모두 구간 문제를 버티게 만드는 구조지만, 펜윅은 더 가볍고 세그먼트 트리는 더 일반적입니다.

구간 합 중심의 가벼운 문제인지, 더 넓은 구간 연산까지 커질 문제인지를 먼저 보면 둘의 선택 기준이 훨씬 분명해집니다.

함께보면 좋은 글