코딩테스트/이진 탐색
bisect_left, bisect_right 구현
수타.
2023. 6. 7. 19:59
이진정렬 문제를 풀때, underbounded , upperbounded에 대한 개념이 명확하지 않아, 관련문제가 자꾸 헷갈려 직접 구현하며 개념을 정리하려 합니다.
bisect_left
arr = list(map(int,input().split()))
def bisect_left(k):
lo = 0
hi = len(arr)-1
while lo<hi:
m = (lo+hi)//2
if arr[m] < k:
lo = m +1
else:
hi = m
return lo
#1 2 2 4 8 9
for i in range(1,11):
print(i,bisect_left(i))
결과:
결과를 보면 찾는 숫자가 한개 이상있다면 그중 가장 왼쪽의 자리를 (하나라면 그자리) ,
없다면 그보다 작은값과 큰값 사이에 들어가는데 이때 자기보다 큰 숫자들을 오른쪽으로 밀고 그자리를 반환한다.
다만 이때 가장큰값보다 큰값이 주어지면 마지막 자리를 반환한다.
bisect_right
arr = list(map(int,input().split()))
def bisect_right(k):
lo = 0
hi = len(arr)-1
while lo<hi:
m = (lo+hi)//2
if arr[m] > k:
hi = m
else:
lo = m +1
return lo
#1 2 2 4 8 9
for i in range(1,11):
print(i,bisect_right(i))
결과 :
결과를 보면 찾는 숫자가 있다면 그 오른쪽의 위치를 반환하는것을 알 수 있다.(두개이상이라면 맨오른쪽 옆)
다만 이번에도 맨마지막숫자 또는 그보다 큰수가 들어오면 최대값인 마지막자리를 반환한다