bisect 라이브러리는 정렬된 배열에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다. 해당 소스 코드는 아래에서 확인이 가능하다.
이진 탐색함수를 짜는 것은 어렵진 않지만 이미 개발이 되어있는 라이브러리를 쓰는 것이 시간적인 효율성과 안정성을 부여할 수 있다.
위의 탐색 라이브러리중에서 중요한 bisect_left 와 bisect_right를 설명하고자 한다.
bisect_left(a, x)
: 정렬된 a 리스트 상태를 가정하며 정렬된 상태를 유지하면서 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
bisect_right(a, x)
: 정렬된 a 리스트 상태를 가정하며 정렬된 상태를 유지하면서 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
파이썬 코드로 위의 내용을 구현하면 아래와 같다.
from bisect import bisect_left, bisect_right
a = [1, 2, 3, 3, 3, 5, 5, 7]
x = 3
print(bisect_left(a, x))
print(bisect_right(a, x))
from bisect import bisect_left, bisect_right
# 값이[left_value, right_value]에 포함되는 데이터의 개수를 반환하는 함수
def count_range(list: list[int], left_value: int, right_value: int) -> int:
left_index = bisect_left(list, left_value)
right_index = bisect_right(list, right_value)
return right_index - left_index