python | 파이썬 이진 탐색 라이브러리 bisect 사용하기

2023. 4. 25. 19:43·TIL/python

bisect은 정렬된 리스트에서 특정 원소를 찾을 때 효과적으로 사용할 수 있는 라이브러리이다.

 

많은 메소드들 중 bisect_left, bisect_right를 사용하면 많은 문제들을 해결할 수 있다.

  • bisect_left(a, x): 배열 a의 정렬된 상태를 유지하면서 원소 x를 삽입할 수 있는 가장 왼쪽 인덱스를 리턴
  • bisect_right(a, x): 배열 a의 정렬된 상태를 유지하면서 원소 x를 삽입할 수 있는 가장 오른쪽 인덱스를 리턴
from bisect import bisect_left, bisect_right

 

정렬된 배열 array=[1, 2, 3, 4, 4, 6, 8, 9]가 있을 때, 4를 삽입할 수 있는 가장 왼쪽 인덱스와 가장 오른쪽 인덱스를 찾기 위해서는 다음과 같이 코드를 작성할 수 있다.

from bisect import bisect_left, bisect_right

array = [1, 2, 3, 4, 4, 6, 8, 9]
x = 4

print(bisect_left(array, x)) # 3
print(bisect_right(array, x)) # 5

array의 정렬을 유지하면서 x=4를 삽입할 수 있는 가장 왼쪽 위치는 [1, 2, 3, (4), 4, 4, 6, 8, 9]가 될 것이고, 이때의 인덱스는 3이므로 bisect_left의 결과로 3이 리턴된다.

array의 정렬을 유지하면서 x=4를 삽입할 수 있는 가장 오른쪽 위치는 [1, 2, 3, 4, 4, (4), 6, 8, 9]가 될 것이고, 이때의 인덱스는 3이므로 bisect_right의 결과로 5가 리턴된다.

 

bisect_left와 bisect_right를 사용해 해당 배열에서 특정 범위에 포함되는 원소의 개수를 구할 수 있다.

from bisect import bisect_left, bisect_right

# 값이 [left, right] 범위에 있는 데이터의 개수를 반환하는 함수
def count_by_range(a, left, right):
    right_index = bisect_right(a, right)
    left_index = bisect_left(a, left)
    return right_index - left_index

array = [1, 2, 3, 4, 4, 6, 8, 9]

# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(array, -1, 3))

count_by_range 함수는 배열 a와 left, right를 매개변수로 넘겨받는다.

배열 a에서 bisect_right을 사용하여 right를 삽입할 수 있는 가장 오른쪽 인덱스를 찾아 right_index에 저장하고

bisect_left를 사용하여 left를 삽입할 수 있는 가장 왼쪽 인덱스를 찾아 left_index에 저장한다.

right_index에서 left_index를 빼면 left에서 right 간의 인덱스 차를 구할 수 있고, 그 인덱스 차는 left에서 right 사이에 포함된 값의 개수를 의미한다.

즉, right_index - left_index는 left에서 right까지의 범위에 포함되는 데이터의 개수가 되는 것이다.

이 코드를 실행하면, [-1, 3] 범위에 있는 데이터인 개수인 3이 출력된다.(1, 2, 3)

 

위 count_by_range 함수를 이용하면 배열 a에서 원소 x의 개수를 구할 수도 있다.

from bisect import bisect_left, bisect_right

# 값이 [left, right] 범위에 있는 데이터의 개수를 반환하는 함수
def count_by_range(a, left, right):
    right_index = bisect_right(a, right)
    left_index = bisect_left(a, left)
    return right_index - left_index

array = [1, 2, 3, 4, 4, 6, 8, 9]

# 값이 4인 데이터 개수
print(count_by_range(a, 4, 4))

count_by_value 함수를 사용하면 left에서 right 범위에 해당하는 원소의 개수를 구할 수 있으므로, left와 right에 같은 값을 입력해 주면 해당 값의 개수를 구할 수 있다.

이 코드는 [4, 4] 범위에 해당하는 데이터의 개수를 구하는 것이므로 array에서 [4, 4]에 해당하는 4의 개수인 2를 출력한다.

저작자표시 (새창열림)
'TIL/python' 카테고리의 다른 글
  • pandas | describe()를 사용하여 object 데이터까지 확인하기
  • pandas | merge(), join(), concat() 함수 사용하기
  • python | collections.Counter 사용하기
  • pandas | datetime 라이브러리 사용하기
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (44)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
python | 파이썬 이진 탐색 라이브러리 bisect 사용하기
상단으로

티스토리툴바