오름차순으로 정렬된 배열을 반복적으로 반으로 나누어 원하는 숫자(target)을 찾는 알고리즘이다. (정렬된 배열에서 빠르게 원하는 원소를 찾는 방법)

def binary_search(target, data):
data.sort()
start = 0 # 맨 처음 위치
end = len(data) - 1 # 맨 마지막 위치
while start <= end:
mid = (start + end) // 2 # 중간값
if data[mid] == target:
return mid # target 위치 반환
elif data[mid] > target: # target이 작으면 왼쪽을 더 탐색
end = mid - 1
else: # target이 크면 오른쪽을 더 탐색
start = mid + 1
return
from bisect import bisect_left, bisect_right
a = [1,1,3,4,5,6,7]
b = [1,2,3,4,5,6,7]
c = 2
print(bisect_left(a, c),bisect_right(a, c))
>>> 2 2
print(bisect_left(b, c),bisect_right(b, c))
>>> 1 2