[Algorithm] Binary Search
๐ฃ
๋ณธ ํฌ์คํธ๋ โ์ด๊ฒ์ด ์ทจ์
์ ์ํ ์ฝ๋ฉ ํ
์คํธ๋ค with ํ์ด์ฌโ์ ๊ณต๋ถํ๊ณ ์์ฑํ์์ต๋๋ค :)
click > (์ด์ฝํ
2021) ์ด๊ฒ์ด ์ทจ์
์ ์ํ ์ฝ๋ฉ ํ
์คํธ๋ค with ํ์ด์ฌ
Binary Search
์ด๋ก
์์ฐจ ํ์(Sequential Search)์ ๋ฆฌ์คํธ ์์ ์๋ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ก๋๋ก ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด์ง ํ์(Binary Search)๋ ๋ฐฐ์ด ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ ๋, ์์น๋ฅผ ๋ํ๋ด๋ ๋ณ์ 3๊ฐ(์์์ , ๋์ , ์ค๊ฐ์ )์ ์ด์ฉํ์ฌ ์ค๊ฐ์ ๊ณผ ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ตํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ํ ์ด์ง ํ์ ๋ฌธ์ ๋ ํ์๋ฒ์๊ฐ ํผ ์ํฉ์์ ํ์์ ๊ฐ์ ํ๋ ๋ฌธ์ ๊ฐ ๋ง๋ค. ํ์ ๋ฒ์๊ฐ 2000๋ง์ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ ์ด์งํ์์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์ข๋ค.
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ํ ๋จ๊ณ๋ฅผ ๊ฑฐ์น ๋๋ง๋ค ํ์ธํ๋ ์์๊ฐ ํ๊ท ์ ์ผ๋ก ์ ๋ฐ์ผ๋ก ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ O(logN)์ด๋ค.
์ฌ๊ทํจ์๋ก ๊ตฌํํ ์ด์งํ์
# ์ด์ง ํ์ ์์ค์ฝ๋ ๊ตฌํ (์ฌ๊ท ํจ์)
def binary_search(array, target, start, end):
if start > end:
return None
mid = (start + end) // 2
# ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ
if array[mid] == target:
return mid
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ธ
elif array[mid] > target:
return binary_search(array, target, start, mid - 1)
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else:
return binary_search(array, target, mid + 1, end)
# n(์์์ ๊ฐ์)๊ณผ target(์ฐพ๊ณ ์ ํ๋ ๊ฐ)์ ์
๋ ฅ ๋ฐ๊ธฐ
n, target = list(map(int, input().split()))
# ์ ์ฒด ์์ ์
๋ ฅ ๋ฐ๊ธฐ
array = list(map(int, input().split()))
# ์ด์ง ํ์ ์ํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
result = binary_search(array, target, 0, n - 1)
if result == None:
print("์์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")
else:
print(result + 1)
๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ ์ด์ง ํ์
# ์ด์ง ํ์ ์์ค์ฝ๋ ๊ตฌํ (๋ฐ๋ณต๋ฌธ)
def binary_search(array, target, start, end):
while start <= end:
mid = (start + end) // 2
# ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ
if array[mid] == target:
return mid
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ธ
elif array[mid] > target:
end = mid - 1
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else:
start = mid + 1
return None
# n(์์์ ๊ฐ์)๊ณผ target(์ฐพ๊ณ ์ ํ๋ ๊ฐ)์ ์
๋ ฅ ๋ฐ๊ธฐ
n, target = list(map(int, input().split()))
# ์ ์ฒด ์์ ์
๋ ฅ ๋ฐ๊ธฐ
array = list(map(int, input().split()))
# ์ด์ง ํ์ ์ํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
result = binary_search(array, target, 0, n - 1)
if result == None:
print("์์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")
else:
print(result + 1)
์ด์ง ํ์ ํธ๋ฆฌ
ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ํํธ์จ์ด์์๋ ๋๋ถ๋ถ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ๋ก ์ ์ฅํด์ ์ด์ง ํ์๊ณผ ๊ฐ์ ํ์ ๊ธฐ๋ฒ์ ์ด์ฉํด ๋น ๋ฅด๊ฒ ํ์์ ํ๋ค. ์ด์ง ํ์ ํธ๋ฆฌ๋ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ ์ค์์๋ ์ด์ง ํ์์ด ๋์ํ ์ ์๋๋ก ๊ณ ์๋, ํจ์จ์ ์ธ ํ์์ด ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ด์ง ํ์ ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
- ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ์ผ์ชฝ ์์ ๋ ธ๋๊ฐ ์๋ค.
- ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๊ฐ ํฌ๋ค.
์ค์ ๋ฌธ์
[์ค์ ๋ฌธ์ 1] ๋ถํ ์ฐพ๊ธฐ
- ์ด์ง ํ์์ผ๋ก ๊ตฌํ
def binary_search(array, target, start, end):
while start <= end:
mid = (start + end) // 2
# ์ฐพ์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์ธ๋ฑ์ค ๋ฐํ
if array[mid] == target:
return mid
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ธ
elif array[mid] > target:
end = mid - 1
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else:
start = mid + 1
return None
# N(๊ฐ๊ฒ์ ๋ถํ ๊ฐ์) ์
๋ ฅ
n = int(input())
# ๊ฐ๊ฒ์ ์๋ ์ ์ฒด ๋ถํ ๋ฒํธ๋ฅผ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ
array = list(map(int, input().split()))
array.sort() # ์ด์ง ํ์์ ์ํํ๊ธฐ ์ํด ์ฌ์ ์ ์ ๋ ฌ ์ํ
# M(์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๊ฐ์) ์
๋ ฅ
m = int(input())
# ์๋์ด ํ์ธ ์์ฒญํ ์ ์ฒด ๋ถํ ๋ฒํธ๋ฅผ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ
x = list(map(int, input().split()))
# ์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๋ฒํธ๋ฅผ ํ๋์ฉ ํ์ธ
for i in x:
# ํด๋น ๋ถํ์ด ์กด์ฌํ๋์ง ํ์ธ
result = binary_search(array, i, 0, n - 1)
if result != None:
print('yes', end=' ')
else:
print('no', end=' ')
- ๊ณ์ ์ ๋ ฌ์ ํ์ฉํ์ฌ ๊ตฌํ
# N(๊ฐ๊ฒ์ ๋ถํ ๊ฐ์) ์
๋ ฅ
n = int(input())
array = [0] * 1000001
# ๊ฐ๊ฒ์ ์๋ ์ ์ฒด ๋ถํ ๋ฒํธ๋ฅผ ์
๋ ฅ ๋ฐ์์ ๊ธฐ๋ก
for i in input().split():
array[int(i)] = 1
# M(์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๊ฐ์) ์
๋ ฅ
m = int(input())
# ์๋์ด ํ์ธ ์์ฒญํ ์ ์ฒด ๋ถํ ๋ฒํธ๋ฅผ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ
x = list(map(int, input().split()))
# ์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๋ฒํธ๋ฅผ ํ๋์ฉ ํ์ธ
for i in x:
# ํด๋น ๋ถํ์ด ์กด์ฌํ๋์ง ํ์ธ
if array[i] == 1:
print('yes', end=' ')
else:
print('no', end=' ')
- ์งํฉ ์๋ฃํ์ ์ด์ฉํ์ฌ ๊ตฌํ
# N(๊ฐ๊ฒ์ ๋ถํ ๊ฐ์) ์
๋ ฅ
n = int(input())
# ๊ฐ๊ฒ์ ์๋ ์ ์ฒด ๋ถํ ๋ฒํธ๋ฅผ ์
๋ ฅ ๋ฐ์์ ์งํฉ(Set) ์๋ฃํ์ ๊ธฐ๋ก
array = set(map(int, input().split()))
# M(์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๊ฐ์) ์
๋ ฅ
m = int(input())
# ์๋์ด ํ์ธ ์์ฒญํ ์ ์ฒด ๋ถํ ๋ฒํธ๋ฅผ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ
x = list(map(int, input().split()))
# ์๋์ด ํ์ธ ์์ฒญํ ๋ถํ ๋ฒํธ๋ฅผ ํ๋์ฉ ํ์ธ
for i in x:
# ํด๋น ๋ถํ์ด ์กด์ฌํ๋์ง ํ์ธ
if i in array:
print('yes', end=' ')
else:
print('no', end=' ')
[์ค์ ๋ฌธ์ 2] ๋ก๋ณถ์ด ๋ก ๋ง๋ค๊ธฐ
n, m = map(int, input().split())
array = list(map(int, input().split()))
start = 0
end = max(array)
answer = 0
while start <= end:
mid = (start + end) // 2
value = 0
for a in array:
if a > mid:
value += (a - mid)
if value < m :
end = mid - 1
else:
answer = mid # ์ต๋ํ ๋ ์๋์ ๋๊ฐ ์ ๋ต์ด๋ฏ๋ก, ์ฐ์ answer์ ์ ์ฅ
start = mid + 1
print(answer)
๋๊ธ๋จ๊ธฐ๊ธฐ