bisect
모듈이란?.bisect_left(a, x, lo=0, hi=len(a), *, key=None)
a
의 정렬을 유지한 채 x
를 삽입할 수 있는 위치들 중 가장 왼쪽을 반환.bisect(a, x, lo=0, hi=len(a), *, key=None)
a
의 정렬을 유지한 채 x
를 삽입할 수 있는 위치들 중 가장 오른쪽을 반환.bisect_right
와 동일.insort_left(a, x, lo=0, hi=len(a), *, key=None)
bisect_left
위치에 값을 삽입.insort(a, x, lo=0, hi=len(a), *, key=None)
bisect_right
위치에 값을 삽입.insort_right
와 동일a
: 정렬된 listx
: a에 삽입할 elementlo, hi
: a
의 일부 구간에 대해서만 삽입 위치를 찾고 싶을 때 사용lo=0, hi=len(a)
)Key
: 각 요소를 비교하기 전에 변환하는 함수Key=None
→ list 요소를 직접 비교)import bisect
lst = [4, 4, 2, 5, 1, 10, 7, 7] # 탐색할 list는 항상 오름차순으로 정렬되어 있어야 함에 유의하자!
lst = sorted(lst) # 정렬 후: lst = [1, 2, 4, 4, 5, 7, 7, 10]
# 3을 삽입할 왼쪽 위치 찾기
pos_left = bisect.bisect_left(lst, 3)
print("bisect_left:", pos_left) # bisect_left: 2 (1, 2와 4 사이에 삽입 -> index=2)
# 5을 삽입할 오른쪽 위치 찾기
pos_right = bisect.bisect_right(lst, 5)
print("bisect_right:", pos_right) # bisect_right: 5 (1, 2, 4, 4, 5와 7 사이에 삽입 -> index=5)
# bisect는 bisect_right와 동일하다.
pos = bisect.bisect(lst, 5)
print("bisect:", pos) # bisect: 5
# 3을 bisect_left 위치에 삽입하
bisect.insort_left(lst, 3)
print("insort_left:", lst) # insort_left: [1, 2, 3, 4, 4, 5, 7, 7, 10]
# 5을 bisect_right 위치에 삽입
bisect.insort_right(lst, 5)
print("insort_right:", lst) # insort_right: [1, 2, 3, 4, 4, 5, 5, 7, 7, 10]
이해를 위해 아래 두 문제를 bisect
를 이용해 풀어봅시다.
정답 예시: