세그먼트 트리 구간 질의 계산기
배열을 넣으면 세그먼트 트리를 만들어 구간 질의가 어느 노드를 타고 답하는지 실제로 방문한 노드를 칠해 보입니다. 어떤 구간이든 2·log₂n개 노드로 덮인다는 것을 개수로 확인할 수 있고, 합·최솟값·최댓값을 바꿔 가며 결합법칙만 있으면 된다는 것도 볼 수 있습니다.
쉼표나 공백으로 나눠 적습니다. 20개까지, 음수·소수도 됩니다. 자리는 1번부터 셉니다.
2번부터 6번까지의 합
26
노드 3개만 보고 답했습니다. 어떤 구간이든 2·log₂n = 6개를 넘지 않습니다. 원소를 하나씩 훑으면 5번 봐야 합니다.
트리와 질의가 들른 노드
칸 안의 큰 숫자가 그 노드에 담긴 값, 작은 숫자가 맡은 구간입니다. 파랗게 칠한 노드가 구간에 완전히 들어가 답에 보탠 노드이고, 짙은 회색은 반쯤 걸쳐 아래로 더 내려간 노드, 흐린 것은 겹치지 않아 바로 돌아선 노드입니다.
각 층에서 파란 노드는 왼쪽 끝에 많아야 하나, 오른쪽 끝에 많아야 하나뿐입니다. 가운데는 부모가 통째로 삼키기 때문입니다. 층이 log₂n개이므로 합쳐서 2·log₂n개를 넘을 수 없고, 이것이 구간 질의가 O(log n)인 이유입니다.
점 갱신 — 잎에서 뿌리까지
| 맡은 구간 | 바뀌기 전 | 바뀐 뒤 |
|---|---|---|
| 3 ~ 3 | 6 | 20 |
| 3 ~ 4 | 9 | 23 |
| 1 ~ 4 | 22 | 36 |
| 1 ~ 8 | 39 | 53 |
3번 원소를 20으로 바꾸면 그 잎에서 뿌리까지 4개 노드만 고치면 됩니다. 그 원소를 맡고 있는 노드가 잎에서 뿌리로 올라가는 한 줄뿐이기 때문입니다. 최솟값·최댓값을 담고 있으면 값이 그대로인 노드도 나오는데, 다른 자식 쪽이 더 작거나 커서 답이 바뀌지 않은 경우입니다.
사용 방법
- 1배열을 쉼표나 공백으로 나눠 적습니다. 자리는 1번부터 셉니다.
- 2무엇을 담을지 고릅니다. 합·최솟값·최댓값 모두 같은 트리 구조로 돌아갑니다.
- 3구간의 시작과 끝을 정하면 답과 함께 어느 노드를 탔는지 나옵니다.
- 4트리 그림에서 파란 노드(답에 보탠 노드)의 개수를 2·log₂n과 견줍니다.
- 5「바꿀 자리」와 「새 값」을 넣어 잎에서 뿌리까지 몇 개 노드만 고치면 되는지 봅니다.
자주 묻는 질문
어떤 구간이든 많아야 2·log₂n개 노드로 덮이기 때문입니다. 각 층에서 「구간에 완전히 들어가는 노드」로 쓰이는 것은 왼쪽 끝에 많아야 하나, 오른쪽 끝에 많아야 하나뿐입니다. 가운데는 부모가 통째로 삼키므로 더 내려갈 일이 없습니다. 층이 log₂n개이므로 합쳐서 2·log₂n개입니다.
결합법칙을 만족하는 연산이면 무엇이든 됩니다. 노드가 하는 일은 「왼쪽 답과 오른쪽 답을 합치는 것」뿐이라, 그 합치기만 결합법칙을 지키면 최솟값·최댓값·최대공약수·행렬 곱까지 같은 구조로 돌아갑니다. 교환법칙조차 필요 없고 왼쪽·오른쪽 순서만 지키면 됩니다.
세그먼트 트리는 역원이 필요 없다는 것이 가장 큰 차이입니다. 펜윅 트리는 구간 질의를 「r까지의 답 − (l−1)까지의 답」이라는 뺄셈으로 내므로 연산에 역원이 있어야 하고, 그래서 구간 최솟값에는 쓸 수 없습니다. 대신 펜윅은 코드가 훨씬 짧고 메모리를 덜 씁니다. 구간 합만 필요하면 펜윅, 최솟값·최댓값이 필요하면 세그먼트 트리입니다.
마지막 층이 비뚤어지는 n에서 가장 큰 노드 번호가 2n을 넘기 때문입니다. 뿌리를 1, 자식을 2i·2i+1로 매기면 n = 6, 10, 12, 18처럼 원소 수가 2의 거듭제곱이 아닐 때 잎이 한 층 더 내려가면서 번호가 커집니다. n이 2의 거듭제곱일 때는 딱 2n−1로 맞아떨어져서, 그런 값으로만 시험하면 놓치기 쉬운 사고입니다.
실제로 값이 들어 있는 노드는 2n−1개입니다. 잎이 n개이고 각 내부 노드가 자식을 정확히 둘 가지므로 내부 노드가 n−1개입니다. 다만 힙 색인으로 번호를 매기면 중간에 비는 번호가 생기므로 배열은 4n으로 잡습니다.
그 원소를 맡고 있는 노드가 잎에서 뿌리로 올라가는 한 줄뿐이기 때문입니다. 잎의 깊이가 ⌈log₂n⌉이므로 고칠 노드도 그만큼입니다. 최솟값·최댓값을 담고 있으면 값이 그대로인 노드도 나오는데, 다른 자식 쪽이 더 작거나 커서 답이 바뀌지 않은 경우입니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 검증은 무작위 배열 500벌의 모든 구간을 합·최솟값·최댓값 세 연산으로 각각 질의해, 원소를 하나씩 훑은 값과 일치하는지 대조해 했습니다. 소수와 음수가 섞인 경우도 함께 맞췄습니다.
- 모든 n(1~20)의 모든 구간에서 답에 보탠 노드 수가 2·log₂n을 넘지 않는 것, 그 노드들이 구간을 빈틈없이 이어 덮는 것을 테스트로 고정해 두었습니다.
- 노드 수가 2n−1인 것, 부모 값이 두 자식을 합친 값인 것, 자식 구간이 부모 구간을 정확히 반으로 나누는 것도 무작위 입력으로 확인했습니다.
- n이 6, 10, 11, 12, 18, 20일 때 가장 큰 노드 번호가 2n을 넘는 것과, 2의 거듭제곱일 때는 정확히 2n−1인 것을 함께 고정했습니다. 배열을 2n으로 잡으면 넘치는 자리입니다.
- 점 갱신이 잎에서 뿌리까지 정확히 그 원소를 맡은 노드만 고치는지, 고친 뒤의 모든 구간 질의가 새 배열의 답과 맞는지도 대조했습니다.
- 원소 20개까지 다룹니다. 트리 전체를 그리는 것이 목적이라 그보다 크면 화면이 읽히지 않습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.