Algorithm/๐ Concept
[์๊ณ ๋ฆฌ์ฆ] ๋ฒ์๋ฅผ ๋ฐ์ฉ ์ขํ๊ฐ๋ ์ด์ง ํ์ - ํ์ด์ฌ(Python)
J1Yun
2021. 7. 31. 18:00
728x90
์์ฐจ ํ์
- ๋ฆฌ์คํธ ์์ ์๋ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฐจ๋ก๋๋ก ํ์ธํ๋ ๋ฐฉ๋ฒ
- ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ์์๋ถํฐ ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ์ผ์นํ๋์ง ํ์ธํ์ฌ ์ผ์นํ๋ฉด ํ์ ์ข ๋ฃ, ์ผ์นํ์ง ์์ผ๋ฉด ๋ค์ ์์๋ก ์ด๋ํ๋ค.
# ์์ฐจ ํ์
def sequential_search(n, target, array):
for i in range(n):
if array[i] == target:
return i+1 # ํ์ฌ ์์น ๋ฐํ (-๋ฒ์งธ)
array = ['S', 'T', 'A', 'R'] # ์์ ์ง์ ๋ฆฌ์คํธ
print("๋ฆฌ์คํธ ์ A์ ์์น๋ " + sequential_search(len(array), 'A', array) + "์
๋๋ค.") # ํ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ
์ด์ง ํ์
- ๋ฆฌ์คํธ ๋ด์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ฒ์๋ฅผ ๊ณ์ ์ค์ฌ๋๊ฐ๋ฉฐ ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ์ ๋ฒ์์ ์ค๊ฐ์ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ตํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ๋ฒ
์์) ์ ๋ ฌ๋ 10๊ฐ์ ๋ฐ์ดํฐ ์ค์์ ๊ฐ์ด 4์ธ ์์ ์ฐพ๊ธฐ
- ์์์ ๊ณผ ๋์ ์ฌ์ด์ ์ค๊ฐ์ ์ ๊ตฌํ๋ค. ์ค๊ฐ์ ์ด ์ค์์ผ ๋๋ ์์์ ์ดํ๋ฅผ ๋ฒ๋ฆฐ๋ค. ๊ทธ๋ฆผ์์ ์์์ ์ [0], ๋์ ์ [9]์ด๋ฏ๋ก ์ค๊ฐ์ ์ [4]์ด๋ค. ๋ฐ๋ผ์, ์ค๊ฐ์ [4]์ ๋ฐ์ดํฐ 8๊ณผ ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ 4๋ฅผ ๋น๊ตํ๋ค. ์ค๊ฐ์ ์ ๋ฐ์ดํฐ 8์ด ๋ ํฌ๋ฏ๋ก ๋์ ์ [4]์ ์ด์ ์ธ [3]์ผ๋ก ์ฎ๊ฒจ ๋ฒ์๋ฅผ ์ขํ๋ค.
- ์์์ [0], ๋์ [3]์ ์ค๊ฐ์ [1]์ ์์นํ ๋ฐ์ดํฐ 2๋ ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ 4๋ณด๋ค ์์ผ๋ฏ๋ก ์์์ ์ [2]๋ก ์ฎ๊ฒจ ๋ฒ์๋ฅผ ๋ค์ํ๋ฒ ์ขํ๋ค.
- ์์์ [2], ๋์ [3]์ ์ค๊ฐ์ [2]์ ์์นํ ๋ฐ์ดํฐ 4๋ ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ 4์ ๊ฐ์ผ๋ฏ๋ก ํ์์ ์ข ๋ฃํ๋ค.
# ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ ์ด์ง ํ์
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 = 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)
ํ์ด์ฌ ์ด์งํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Bisect
โป ๋ฐ๋์ data๊ฐ ์ฌ์ ์ ์ ๋ ฌ๋์ด ์์ด์ผ ํจ
bisect.bisect\_left(data, x)
: data๋ด์ x๊ฐ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ์ฅ ์ผ์ชฝ์(์์) ์ธ๋ฑ์ค ๋ฐํbisect.bisect\_right(data, x)
: data๋ด์ x๊ฐ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์(ํฐ) ์ธ๋ฑ์ค ๋ฐํ
import bisect
data = [1, 2, 2, 3, 4]
x = 2
print(bisect.bisect_left(data, x)) # 1
print(bisect.bisect_right(data, x)) # 3
728x90