
# target์ ์ฒซ ๋ฑ์ฅ ์์น (lower bound)
def lower_bound(arr, target):
start, end = 0, len(arr)
while start < end:
mid = (start + end) // 2
if arr[mid] >= target:
end = mid
else:
start = mid + 1
return start
# target์ ๋ง์ง๋ง ๋ฑ์ฅ ์์น (lower bound)
def upper_bound(arr, target):
start, end = 0, len(arr)-1
while start < end:
mid = (start + end) // 2
if arr[mid] > target:
end = mid
else:
start = mid + 1
return start
๐ while start < end :
while start <= end ์ ์กฐ๊ฑด์ ๋ฌดํ ๋ฐ๋ณต์ด ๋ฐ์ํจ

๐ โจ start, end = 0, len(arr) :
๊ธฐ์กด์ ํน์ ๊ฐ์ ์ฐพ๋ ์ด๋ถํ์๊ณผ ๋ฌ๋ฆฌ end ์ง์ ์ len(arr)์ด ๋์ด์ผ ํจ

why ?โ
๊ธฐ์กด ์ด๋ถํ์ ์ฒ๋ผ end ์กฐ๊ฑด์ len(arr) -1 ๋ก ๊ตฌํํ๋ฉด ๋ง์ง๋ง์ด ๋๋๋ "๊ฒฝ๊ณ" ๋ฅผ ๊ตฌํ ์ ์์
| ์ค์ | ๋ฒ์ | ํ์ ๊ฐ๋ฅํ ์์น | ์ธ์ ์ฌ์ฉ? |
|---|---|---|---|
end = len(arr) | [0, len] | ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๋งจ ๋๊น์ง ํ์ ๊ฐ๋ฅ | lower/upper_bound |
end = len(arr) - 1 | [0, len-1] | ๋ฐฐ์ด ๋ด๋ถ๋ง ํ์ | ๊ฐ์ด ์๋์ง ์ฐพ์ ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅ |