3. 깔끔한 정리 정돈: bisect 모듈
우리가 이미 키 순서대로 줄 세워둔 리스트가 있다고 상상해 보세요. [1번, 2번, 3번, 5번, 6번]
이때 새로운 ‘4번’ 친구가 나타났습니다. 이 친구가 줄에 끼어들려면 어떻게 해야 할까요?
처음부터 1번과 비교하고, 2번과 비교하고 하나씩 비교하다 보면 시간이 너무 오래 걸리겠죠? 파이썬은 이미 완벽하게 정렬된 줄에 새로운 녀석을 순서 파괴 없이 가장 빠르게 쏙! 끼워 넣는 마법의 모듈, bisect(이진 탐색) 모듈을 제공합니다.
3.1 넌 어디로 들어가야 해? (bisect)
먼저, 새로운 숫자가 줄의 몇 번째 자리에 들어가야 줄이 망가지지 않는지 위치(Index)를 물어볼 수 있습니다.
import bisect
# 완벽하게 오름차순으로 정렬된 줄
line = [1, 2, 3, 5, 6]
# "4는 이 줄의 몇 번째 인덱스로 들어가야 정렬이 유지되니?"
position = bisect.bisect(line, 4)
print(f"4가 들어갈 자리는 {position}번 인덱스입니다!")
# 출력: 4가 들어갈 자리는 3번 인덱스입니다!
3.2 곧바로 줄에 끼워 넣기 (insort)
어느 자리에 들어갈지 물어보는 것을 넘어, 한 큐에 딱 그 자리에 녀석을 밀어 넣고 싶다면 insort (insert + sort 합침) 마법을 쓰면 됩니다!
import bisect
line = [1, 2, 3, 5, 6]
# 4를 줄의 알맞은 위치에 확 끼워 넣어라!
bisect.insort(line, 4)
# 짠! 줄은 여전히 차례대로 정렬되어 있습니다.
print(line)
# 출력: [1, 2, 3, 4, 5, 6]
만약 동일한 숫자를 넣을 때 “기존 친구 앞쪽에 설래? 뒷쪽에 설래?”를 정해주고 싶다면 bisect_left(앞쪽), bisect_right(뒤쪽) 같이 섬세한 방향 옵션도 고를 수 있답니다.
정렬된 데이터에 계속해서 새로운 것을 주입해야 하는 프로그래밍 대회 코딩 문제나 고속 스피드가 생명인 게임 엔진에서 bisect는 엄청난 위력을 발휘합니다!
서브목차