도구스개발

이진 탐색 과정 계산기

정렬된 목록에서 값을 찾는 동안 low·mid·high가 어떻게 움직이는지 단계별로 보여 주고 비교 횟수를 셉니다. 못 찾았을 때 끼워 넣을 자리와 lower_bound·upper_bound도 함께 냅니다.

오름차순이어야 합니다. 공백이나 쉼표로 나눠 200개까지 넣습니다.

찾은 자리

인덱스 5

2번 비교했습니다. 앞에서부터 하나씩 봤다면 6번이 필요했습니다.

원소 개수7개
비교 횟수2번
이 크기의 최대 비교 횟수3번 (⌈log₂(n+1)⌉)
선형 탐색이었다면6번
lower_bound (이 값 이상이 처음 나오는 자리)5
upper_bound (이 값 초과가 처음 나오는 자리)6
이 값의 개수1개
선형 탐색보다 4번 덜 봤습니다. 한 번 비교할 때마다 후보가 절반으로 줄기 때문이며, 원소가 백만 개여도 스무 번이면 끝납니다(2²⁰ = 1,048,576).

단계별로 보기

lowmidhighmid 값남은 후보판정
103677찾는 값이 더 크다 → 오른쪽 절반
2456113같다 — 찾았다

mid를 구하는 식에 함정이 있다

mid = (low + high) / 2        ← 위험
mid = low + (high − low) / 2  ← 안전

앞의 식은 low + high가 정수 최댓값을 넘으면 음수가 되어 무너집니다. 자바 표준 라이브러리의 이진 탐색에 이 버그가 9년 동안 있다가 2006년에 고쳐진 일이 유명합니다. 자바스크립트의 수는 2⁵³까지 안전해 실제로 터지지는 않지만, 식을 안전한 쪽으로 적어 두는 편이 옳습니다. 이 계산기도 아래 식을 씁니다.

사용 방법

  1. 1오름차순으로 정렬된 숫자 목록을 넣습니다. 정렬되어 있지 않으면 경고가 뜹니다.
  2. 2찾을 값을 넣습니다.
  3. 3단계 표에서 low·mid·high가 어떻게 좁혀지는지, 남은 후보가 몇 개씩 줄어드는지 확인합니다.
  4. 4없는 값을 넣어 보고 멈춘 자리(끼워 넣을 자리)가 어디인지 확인합니다.

자주 묻는 질문

원소가 n개면 최대 ⌈log₂(n+1)⌉번 비교합니다. 원소가 1,000개면 10번, 100만 개면 20번입니다. 한 번 볼 때마다 후보가 절반으로 줄기 때문이며, 이것이 앞에서부터 하나씩 보는 선형 탐색(최대 n번)과의 차이입니다. 다만 찾는 값이 목록 맨 앞에 있다면 선형 탐색이 한 번 만에 끝나므로, 이진 탐색이 언제나 적게 보는 것은 아닙니다.

있는 값을 「없다」고 답할 수 있습니다. 이진 탐색은 「가운데 값보다 크면 오른쪽에 있다」는 전제로 절반을 버리는데, 정렬되어 있지 않으면 그 전제가 깨져 버린 쪽에 답이 있을 수 있습니다. 오류를 내지 않고 조용히 틀리기 때문에 더 위험하며, 이 계산기는 정렬 여부를 먼저 검사해 알려 줍니다.

low + high가 정수 최댓값을 넘으면 오버플로가 나 음수가 되기 때문입니다. mid = low + (high − low) / 2로 쓰면 이 문제가 없습니다. 자바 표준 라이브러리의 이진 탐색에 이 버그가 9년 동안 있다가 2006년에야 고쳐진 일이 유명합니다. 자바스크립트는 수가 2의 53제곱까지 안전해 실제로 터지지는 않지만, 안전한 식으로 적어 두는 편이 좋습니다.

그 값을 끼워 넣을 자리를 알려 줍니다. low와 high가 엇갈리며 멈출 때의 low가 그 자리이며, 여기에 값을 넣으면 정렬이 그대로 유지됩니다. C++의 lower_bound, 파이썬의 bisect_left가 돌려주는 값이 바로 이것입니다.

고전 이진 탐색은 그중 아무 자리나 돌려줍니다. 어느 것을 먼저 만나느냐가 배열 크기에 따라 달라지기 때문입니다. 첫 자리가 필요하면 lower_bound를, 마지막 다음 자리가 필요하면 upper_bound를 써야 하며, 두 값을 빼면 그 값이 몇 개인지 알 수 있습니다. 이 계산기는 셋을 모두 보여 줍니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 검증은 1 3 5 7 9 11 13에서 11을 두 번 비교해 인덱스 5에서 찾는 것, 없는 값 4를 세 번 비교하고 끼워 넣을 자리 2를 내는 것, 1 2 2 2 3에서 lower_bound(2)=1·upper_bound(2)=4를 정답지로 삼았습니다.
  • 무작위 배열 3,000벌에서 선형 탐색과 답이 같은지, 끼워 넣을 자리에 값을 넣으면 정렬이 유지되는지, 비교 횟수가 ⌈log₂(n+1)⌉을 넘지 않는지 대조했습니다.
  • mid는 low + (high − low) / 2로 구합니다. 자바스크립트에서는 오버플로가 나지 않지만 다른 언어로 옮겨 적을 때를 생각해 안전한 식을 씁니다.
  • 값이 같은지 비교할 때 실수의 반올림 오차는 다루지 않습니다. 0.1 + 0.2로 만든 값처럼 미세하게 어긋난 수는 「같다」로 판정되지 않을 수 있습니다.
  • 한 번에 200개까지 다룹니다. 과정을 표로 보이는 것이 목적이라 그보다 많으면 읽히지 않습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.