# Lower bound
# nums[k-1] < key ์ด๊ณ , key <= nums[k]์ธ k๋ฅผ ์ฐพ๋๋ค.
def lower_bound(nums, key):
left, right = 0, len(nums)-1
while left < right: #left์ right๊ฐ ๋ง๋๋ ์ง์ ์ด key๊ฐ ์ด์์ด ์ฒ์ ๋์ค๋ ์์น
mid = (left + right) // 2 # ๋๋ํ ๋๊ฐ๊ฐ ๋จ์์ ๋ mid๊ฐ ์ผ์ชฝ์ด๋ฏ๋ก,
# ์ค๋ฅธ์ชฝ(right)์ mid์ ๊ฐ๊ฒํด์ฃผ์ด์ผ ๋ฌดํ๋ฃจํ์ ๋น ์ง์ง ์๋๋ค.
if key <= nums[mid]:
right = mid # ์ด ๊ฐฑ์ ์ ํตํด, right์ ํด๋นํ๋ ๊ฐ์ key ๋ณด๋ค '์ด์'์์ ๋ณด์ฅํ๋ค.
else:
left = mid + 1
return right # ๋ณด์ฅ๋ ๊ฐ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
# Upper bound
# nums[k-1] <= key ์ด๊ณ , key < nums[k]์ ๋ง์กฑํ๋ ์ต์ k๋ฅผ ์ฐพ๋๋ค.
def upper_bound(nums, key):
left, right = 0, len(nums)-1
while left < right: #left์ right๊ฐ ๋ง๋๋ ์ง์ ์ด key๊ฐ์ ์ด๊ณผํ๋ ๊ฐ์ด ์ฒ์ ๋์ค๋ ์์น
mid = (left + right) // 2 # ๋๋ํ ๋๊ฐ๊ฐ ๋จ์์ ๋ mid๊ฐ ์ผ์ชฝ์ด๋ฏ๋ก,
# ์ค๋ฅธ์ชฝ(right)์ mid์ ๊ฐ๊ฒํด์ฃผ์ด์ผ ๋ฌดํ๋ฃจํ์ ๋น ์ง์ง ์๋๋ค.
if key < nums[mid]:
right = mid # ์ด ๊ฐฑ์ ์ ํตํด, right์ ํด๋นํ๋ ๊ฐ์ key์ '์ด๊ณผ'ํ ๊ฐ์์ ๋ณด์ฅํ๋ค.
else:
left = mid + 1
return right # ๋ณด์ฅ๋ ๊ฐ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.