
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid # 타겟값의 인덱스 반환
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 찾지 못할 경우 -1
function binarySearch(arr, target) {
let left = 0, right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid; // 값 찾음
if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1; // 값 없음
}
파이썬에는 이분 탐색을 위해 bisect 모듈이 존재한다.
bisect_left(arr, x)
bisect_right(arr, x)
import bisect
arr = [1, 3, 3, 3, 5, 7]
x = 3
left = bisect.bisect_left(arr, x) # 1
right = bisect.bisect_right(arr, x) # 4
bisect_left, bisect_right는 실제 코딩테스트에도 자주 나와서 직접 구현해보고 기억해두는것도 좋은 팁이다.
function bisect_left(arr, target) {
let left = 0, right = arr.length;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] < target) left = mid + 1;
else right = mid;
}
return left;
}
function bisect_right(arr, target) {
let left = 0, right = arr.length;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] <= target) left = mid + 1;
else right = mid;
}
return left;
}
// 예시 사용법
const arr = [1, 3, 3, 3, 5, 7];
console.log(bisect_left(arr, 3)); // 출력: 1
console.log(bisect_right(arr, 3)); // 출력: 4
이처럼 bisect는 중복 값의 구간이나, 삽입 위치 찾기 등에 매우 효과적이다.
이진 탐색의 개념을 확장하여, 탐색뿐 아니라 빠른 위치 계산에도 활용한다.
이분 탐색은 정렬된 데이터에서 빠른 탐색 성능이 필요할 때 반드시 쓰이는 핵심 알고리즘이다.
파이썬의 bisect 모듈, 직접 구현 등을 통해 다양한 문제에 적용 가능하다.