// education

06. 이분 탐색(Binary Search)과 매개변수 탐색(Parametric Search) - Lower/Upper Bound

정렬된 데이터셋에서 검색 범위를 절반씩 줄여 나가며 $O(log N)$ 시간에 탐색을 완료하는 **이분 탐색(Binary Search)**과 **매개변수 탐색(Parametric Search)**을 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

import bisect

# 1. 순수 이분 탐색 (Binary Search - O(log N))
def binary_search(arr: list, target: int) -> int:
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2  # 중간 인덱스 계산
        if arr[mid] == target:
            return mid  # 타겟 발견 시 인덱스 즉시 반환
        elif arr[mid] < target:
            left = mid + 1  # 타겟이 우측에 존재 -> 왼쪽 경계 이동
        else:
            right = mid - 1 # 타겟이 좌측에 존재 -> 오른쪽 경계 이동
    return -1  # 미발견 시 -1 반환

# 2. 파이썬 bisect 활용 (Lower Bound & Upper Bound)
arr = [1, 2, 4, 4, 4, 5, 7, 9]
print("Lower Bound (4 이상이 처음 나오는 인덱스):", bisect.bisect_left(arr, 4))
print("Upper Bound (4 초과가 처음 나오는 인덱스):", bisect.bisect_right(arr, 4))
print("숫자 4의 개수:", bisect.bisect_right(arr, 4) - bisect.bisect_left(arr, 4))

# 3. 매개변수 탐색 (Parametric Search - 나무 잘라가기 문제)
def cut_trees_max_height(trees: list, target_length: int) -> int:
    """가져가고자 하는 나무 길이 target_length를 확보할 수 있는 절단기 최대 높이 구하기"""
    left, right = 0, max(trees)
    result = 0
    
    while left <= right:
        mid = (left + right) // 2  # 절단기 높이 후보(mid)
        # 절단기 높이 mid로 잘랐을 때 확보되는 총 나무 길이
        total_cut = sum(t - mid for t in trees if t > mid)
        
        if total_cut >= target_length: # 목표 길이 이상 확보 가능! -> 높이를 더 올려본다
            result = mid
            left = mid + 1
        else: # 목표 길이 부족! -> 절단기 높이를 낮춘다
            right = mid - 1
    return result

print("나무 잘라가기 절단기 최대 높이:", cut_trees_max_height([20, 15, 10, 17], 7))

파이썬 소스 코드 핵심 포인트 해설

  1. bisect_left / bisect_right: 파이썬 표준 라이브러리로, 중복 요소가 있는 정렬 리스트에서 경계 인덱스를 $O(log N)$에 탐색합니다.
  2. Parametric Search: 최적화 문제를 결정 문제(Yes/No)로 바꾸어 이분 탐색 알고리즘으로 극적인 성능 최적화를 이룹니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

06. 이분 탐색(Binary Search)과 매개변수 탐색(Parametric Search) - Lower/Upper Bound 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전05. 정렬 알고리즘 3: 비비교 정렬 및 정렬 안정성 - 계수 정렬, 기수 정렬 및 Stable Sort 다음 →07. 투 포인터(Two Pointers)와 슬라이딩 윈도우(Sliding Window) - 1차원 배열 $O(N)$ 연속 탐색