도구스개발

세그먼트 트리 구간 질의 계산기

배열을 넣으면 세그먼트 트리를 만들어 구간 질의가 어느 노드를 타고 답하는지 실제로 방문한 노드를 칠해 보입니다. 어떤 구간이든 2·log₂n개 노드로 덮인다는 것을 개수로 확인할 수 있고, 합·최솟값·최댓값을 바꿔 가며 결합법칙만 있으면 된다는 것도 볼 수 있습니다.

쉼표나 공백으로 나눠 적습니다. 20개까지, 음수·소수도 됩니다. 자리는 1번부터 셉니다.

2번부터 6번까지의 합

26

노드 3개만 보고 답했습니다. 어떤 구간이든 2·log₂n = 6개를 넘지 않습니다. 원소를 하나씩 훑으면 5번 봐야 합니다.

구간 합26
검산 (하나씩 훑은 값)26
답에 보탠 노드3개
이론 상한 2·log₂n6개
재귀가 들른 노드9개
트리 전체 노드15개 (2n−1)

트리와 질의가 들른 노드

39

1~8

22

1~4

17

5~8

13

1~2

9

3~4

9

5~6

8

7~8

5

1~1

8

2~2

6

3~3

3

4~4

2

5~5

7

6~6

2

7~7

6

8~8

칸 안의 큰 숫자가 그 노드에 담긴 값, 작은 숫자가 맡은 구간입니다. 파랗게 칠한 노드가 구간에 완전히 들어가 답에 보탠 노드이고, 짙은 회색은 반쯤 걸쳐 아래로 더 내려간 노드, 흐린 것은 겹치지 않아 바로 돌아선 노드입니다.

각 층에서 파란 노드는 왼쪽 끝에 많아야 하나, 오른쪽 끝에 많아야 하나뿐입니다. 가운데는 부모가 통째로 삼키기 때문입니다. 층이 log₂n개이므로 합쳐서 2·log₂n개를 넘을 수 없고, 이것이 구간 질의가 O(log n)인 이유입니다.

점 갱신 — 잎에서 뿌리까지

맡은 구간바뀌기 전바뀐 뒤
3 ~ 3620
3 ~ 4923
1 ~ 42236
1 ~ 83953

53

1~8

36

1~4

17

5~8

13

1~2

23

3~4

9

5~6

8

7~8

5

1~1

8

2~2

20

3~3

3

4~4

2

5~5

7

6~6

2

7~7

6

8~8

3번 원소를 20으로 바꾸면 그 잎에서 뿌리까지 4개 노드만 고치면 됩니다. 그 원소를 맡고 있는 노드가 잎에서 뿌리로 올라가는 한 줄뿐이기 때문입니다. 최솟값·최댓값을 담고 있으면 값이 그대로인 노드도 나오는데, 다른 자식 쪽이 더 작거나 커서 답이 바뀌지 않은 경우입니다.

노드가 하는 일은 「왼쪽 답과 오른쪽 답을 합치는 것」뿐입니다. 그 합치기가 결합법칙만 만족하면 합이든 최솟값이든 최대공약수든 그대로 돌아갑니다. 교환법칙조차 필요 없고, 왼쪽·오른쪽 순서만 지키면 됩니다. 위에서 「무엇을 담을 것인가」를 바꿔 보면 같은 트리 구조가 그대로 도는 것을 볼 수 있습니다.
펜윅 트리와 갈리는 지점이 바로 그것입니다. 펜윅은 질의가 「r까지 − (l−1)까지」라는 뺄셈에 기대므로 역원이 있어야 하고, 그래서 최솟값에는 쓸 수 없습니다. 세그먼트 트리는 역원이 필요 없는 대신 코드가 길고 메모리를 더 씁니다.
노드 번호를 뿌리 1, 자식 2i·2i+1로 매기면 배열 하나로 트리를 담을 수 있지만, 배열 길이를 4n으로 잡아야 합니다. 마지막 층이 비뚤어지는 n(6, 10, 12, 18 …)에서는 가장 큰 번호가 2n을 넘기 때문입니다. n이 2의 거듭제곱일 때는 딱 맞아떨어져서 시험에서 놓치기 쉬운 사고입니다.

사용 방법

  1. 1배열을 쉼표나 공백으로 나눠 적습니다. 자리는 1번부터 셉니다.
  2. 2무엇을 담을지 고릅니다. 합·최솟값·최댓값 모두 같은 트리 구조로 돌아갑니다.
  3. 3구간의 시작과 끝을 정하면 답과 함께 어느 노드를 탔는지 나옵니다.
  4. 4트리 그림에서 파란 노드(답에 보탠 노드)의 개수를 2·log₂n과 견줍니다.
  5. 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일 · 결과는 참고용 추정치입니다.