Ch7 Binary Search 7-1
๐ย ์์ฐจ ํ์(Sequential Search) ์๊ณ ๋ฆฌ์ฆ
์์ฐจ ํ์ (Sequential Search) ์ด๋ ๋ฆฌ์คํธ ์์ ์๋ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ ๋ฐฉ๋ฒ.
- ๋ณดํต ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ.
- ๋ฆฌ์คํธ ๋ด์ ๋ฐ์ดํฐ๊ฐ ์๋ฌด๋ฆฌ ๋ง์๋ ์๊ฐ๋ง ์๋ค๋ฉด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์ฅ์ .
- ๋ฐ์ดํฐ ๊ฐ์๊ฐ N๊ฐ์ผ ๋ ์ต๋ N๋ฒ์ ๋น๊ต ์ฐ์ฐ์ด ํ์ํ๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋ O(N)
def sequential_search(n, target, array):
for i in range(n):
if array[i] == target:
return i + 1
input_data = input().split()
n = int(input_data[0])
target = input_data[1]
array = input().split()
print(sequential_search(n, target, array))
๐ย ์ด์ง ํ์(Binary Search) ์๊ณ ๋ฆฌ์ฆ
์ด์ง ํ์ (Binary Search) ์ด๋ ์ ๋ ฌ๋์ด ์๋ ๋ฆฌ์คํธ์์ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ.
- ์ด์ง ํ์์ ์์์ , ๋์ , ์ค๊ฐ์ ์ ์ด์ฉํ์ฌ ํ์ ๋ฒ์๋ฅผ ์ค์ .
- ํต ์ ๋ ฌ(quick_sort)๊ณผ ๋น์ทํ๊ฒ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ํ์.
- ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ํ์ธํ ๋๋ง๋ค ์์์ ๊ฐ์๊ฐ ์ ๋ฐ์ฉ ๊ฐ์ํ๋ค๋ ์ ์์ ์๊ฐ ๋ณต์ก๋๊ฐ O(logN)
- ์ด๊ธฐ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 32๊ฐ์ผ ๋, ์ด์์ ์ผ๋ก 1๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด 16๊ฐ๊ฐ๋์ ๋ฐ์ดํฐ๋ง ๋จ๋๋ค.
- 2๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด 8๊ฐ๊ฐ๋์ ๋ฐ์ดํฐ๋ง ๋จ๋๋ค.
- 3๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด 4๊ฐ๊ฐ๋์ ๋ฐ์ดํฐ๋ง ๋จ๋๋ค.
- ์ด์งํ์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ 2๊ฐ์ง(์ฌ๊ทํจ์, ๋ฐ๋ณต๋ฌธ)
1) ์ฌ๊ทํจ์
# ์ฌ๊ทํจ์ ํธ์ถ
'''
10 7
1 3 5 7 9 11 13 15 17 19
'''
def binary_search_recursive(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_recursive(array, target, start, mid-1)
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else:
return binary_search_recursive(array, target, mid+1, end)
# n(์์์ ๊ฐ์)๊ณผ target(์ฐพ๊ณ ์ ํ๋ ๋ฌธ์์ด)์ ์
๋ ฅ๋ฐ๊ธฐ
n, target = list(map(int, input().split()))
# ์ ์ฒด ์์ ์
๋ ฅ๋ฐ๊ธฐ
array = list(map(int, input().split()))
result = binary_search_recursive(array, target, 0, n-1)
# ์ด์ง ํ์ ์ํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
if result == None:
print('์ฐพ๋ ๊ฐ์ด ์์ต๋๋ค.')
else:
print(result + 1)
์คํ๊ฒฐ๊ณผ
10 7
1 3 5 7 9 11 13 15 17 19
4
10 7
1 3 5 6 9 11 13 15 17 19
์์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค
2) ๋ฐ๋ณต๋ฌธ
# ์ด์ง ํ์ ์์ค์ฝ๋ ๊ตฌํ (๋ฐ๋ณต๋ฌธ)
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)
์คํ๊ฒฐ๊ณผ
10 7
1 3 5 7 9 11 13 15 17 19
4
10 7
1 3 5 6 9 11 13 15 17 19
์์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค
์ฝ๋ฉ ํ ์คํธ ์์์ ์ด์ง ํ์
- ์ด์ง ํ์์ ์ฝ๋ฉ ํ ์คํธ์์ ๋จ๊ณจ๋ก ๋์ค๋ฏ๋ก ๊ฐ๊ธ์ ์ธ์ฐ๊ธธ ๊ถํจ.(์ฐธ๊ณ ํ ์์ค์ฝ๋๊ฐ ์๋ ์ํ์์๋ ์ด์ง ํ์์ ๊ตฌํ์ด ์๋นํ ์ด๋ ค์ธ ์ ์์)
- ํ์ ๋ฒ์๊ฐ 2000๋ง์ด ๋์ด๊ฐ๋ฉด ์ด์ง ํ์์ผ๋ก ๋ฌธ์ ์ ์ ๊ทผํ๊ธธ ๊ถํจ.
- 1000๋ง ๋จ์ ์ด์์ผ๋ก ๋์ด๊ฐ๋ฉด ์ด์ง ํ์๊ณผ ๊ฐ์ดO(logN)์ ์๋๋ฅผ ๋ด์ผ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ ์ฌ๋ ค์ผ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด์ง ํ์๊ณผ ์์ฐจ ํ์ ๋น๊ต
๐ย ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ
- ๋ ธ๋์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ก ํํํ๋ฉฐ ์ฌ๊ธฐ์์ ๋ ธ๋๋ ์ ๋ณด์ ๋จ์๋ก์ ์ด๋ ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ก ์ดํดํ ์ ์์.
- ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ํํธ์จ์ด๋ ๋๋ถ๋ถ ๋ฐ์ดํฐ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ๋ก ์ ์ฅํด์ ์ด์งํ์๊ณผ ๊ฐ์ ํ์ ๊ธฐ๋ฒ์ ์ด์ฉํด ๋น ๋ฅด๊ฒ ํ์์ด ๊ฐ๋ฅํจ.
ํธ๋ฆฌ์ ํน์ง
- ํธ๋ฆฌ๋ ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋์ ๊ด๊ณ๋ก ํํํ๋ค.
- ํธ๋ฆฌ์ ์ต์๋จ ๋ ธ๋๋ฅผ ๋ฃจํธ ๋ ธ๋๋ผ๊ณ ํ๋ค.
- ํธ๋ฆฌ์ ์ตํ๋จ ๋ ธ๋๋ฅผ ๋จ๋ง ๋ ธ๋๋ผ๊ณ ํ๋ค.
- ํธ๋ฆฌ์์ ์ผ๋ถ๋ฅผ ๋ผ์ด๋ด๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ ์ด๋ฅผ ์๋ธ ํธ๋ฆฌ๋ผ๊ณ ํ๋ค.
- ํธ๋ฆฌ๋ ํ์ผ ์์คํ ๊ณผ ๊ฐ์ด ๊ณ์ธต์ ์ด๊ณ ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ์ ์ ํฉํ๋ค.
๐ย ์ด์ง ํ์ ํธ๋ฆฌ
- ํธ๋ฆฌ ์๋ฃ ๊ตฌ์กฐ์ค ๊ฐ์ฅ ๊ฐ๋จํ ํํ.
- ์ด์ง ํ์์ด ๋์ํ๋๋ก ๊ณ ์๋ ํํ.
์ด์ง ํ์ ํธ๋ฆฌ์ ํน์ง
- ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ์ผ์ชฝ ์์ ๋ ธ๋๊ฐ ์๋ค.
- ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋๊ฐ ํฌ๋ค.
๋น ๋ฅด๊ฒ ์ ๋ ฅ๋ฐ๊ธฐ
- Python input() ํจ์๋ ๋์ ์๋๊ฐ ๋๋ฆผ.
- sys ๋ผ์ด์ด๋ธ๋ฌ๋ฆฌ readline() ํจ์๋ฅผ ์ด์ฉํ๋ค.
- sys ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ํ ์ค ์
๋ ฅ๋ฐ๊ณ ๋์ rstrip() ํจ์๋ฅผ ๊ผญ ํธ์ถํด์ผ ํจ.
- readline()์ผ๋ก ์ ๋ ฅํ๋ฉด ์ ๋ ฅ ํ ์ํฐ ๊ฐ ์ค๋ฐ๊ฟ ๊ธฐํธ๋ก ์ ๋ ฅ๋๋๋ฐ, ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด rstrip()๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
import sys
# ํ๋์ ๋ฌธ์์ด ๋ฐ์ดํฐ ์
๋ ฅ๋ฐ๊ธฐ
input()_data = sys.stdin.readline().rstrip()
# ์
๋ ฅ๋ฐ์ ๋ฌธ์์ด ๊ทธ๋๋ก ์ถ๋ ฅ
print(input_data)
๋๊ธ๋จ๊ธฐ๊ธฐ