Algorithm

lower_bound, upper_bound

Doljae 2021. 6. 15. 10:20
def lower_bound(input_list, target_value):
    if not input_list:
        return 0
    lo, hi = 0, len(input_list)
    while lo < hi:
        mid = (lo + hi) // 2
        if input_list[mid] < target_value:
            lo = mid + 1
        else:
            hi = mid

    return lo


def upper_bound(input_list, target_value):
    if not input_list:
        return 0
    lo, hi = 0, len(input_list)
    while lo < hi:
        mid = (lo + hi) // 2
        if target_value < input_list[mid]:
            hi = mid
        else:
            lo = mid + 1

    return lo

bisect_left, bisect_right를 그대로 구현한 코드.

직접 구현해야 할 때 헷갈리면 마지막에 lo를 반환하게만 고정하고, hi 이동은 mid로 고정, lo 이동은 mid+1로 고정하는 걸 의식하자.