Guidelines

λΉ λ₯΄κ³  효율적인 검색 방법, 이진 검색(Binary Search)

이진 검색(Binary Search)은 데이터λ₯Ό 절반으둜 λ‚˜λˆ„μ–΄κ°€λ©° κ²€μƒ‰ν•˜λŠ” 효율적인 검색 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

이번 μˆ˜μ—…μ—μ„œλŠ” 이진 검색 μ•Œκ³ λ¦¬μ¦˜μ˜ κ°œλ…κ³Ό 파이썬으둜 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜λŠ” 방법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


이진 κ²€μƒ‰μ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

이진 검색은 μ •λ ¬λœ λ¦¬μŠ€νŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 검색 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

λ¨Όμ € 리슀트의 쀑간에 μœ„μΉ˜ν•œ 값을 ν™•μΈν•˜κ³ , 이 값이 찾고자 ν•˜λŠ” κ°’κ³Ό κ°™λ‹€λ©΄ 검색이 μ™„λ£Œλ©λ‹ˆλ‹€.

λ§Œμ•½ 찾고자 ν•˜λŠ” 값이 더 μž‘λ‹€λ©΄ 리슀트의 μ™Όμͺ½ μ ˆλ°˜λ§Œμ„, 더 크닀면 였λ₯Έμͺ½ μ ˆλ°˜λ§Œμ„ λ‹€μ‹œ νƒμƒ‰ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 과정을 λ°˜λ³΅ν•˜μ—¬ κ²€μƒ‰ν•˜λ €λŠ” 값을 찾을 λ•ŒκΉŒμ§€ 리슀트λ₯Ό μ ˆλ°˜μ”© μ€„μ—¬λ‚˜κ°‘λ‹ˆλ‹€.


이진 κ²€μƒ‰μ˜ μž₯점

이진 κ²€μƒ‰μ˜ κ°€μž₯ 큰 μž₯점은 검색 λ²”μœ„κ°€ 맀 λ‹¨κ³„λ§ˆλ‹€ 절반으둜 쀄어듀기 λ•Œλ¬Έμ—, 검색 속도가 맀우 λΉ λ₯΄λ‹€λŠ” μ μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 1000개의 데이터가 μžˆμ„ λ•Œ, λ‹¨μˆœνžˆ μ²«λ²ˆμ§ΈλΆ€ν„° λ§ˆμ§€λ§‰κΉŒμ§€ μ°¨λ‘€λŒ€λ‘œ κ²€μƒ‰ν•˜λŠ” μ„ ν˜• 검색은 μ΅œλŒ€ 1000번의 비ꡐ가 ν•„μš”ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 이진 검색은 μ΅œλŒ€ 10번의 λΉ„κ΅λ§ŒμœΌλ‘œλ„ 값을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.


이진 검색을 파이썬으둜 κ΅¬ν˜„ν•˜κΈ°

이제 파이썬으둜 이진 검색을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  수 μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ•„λž˜ μ½”λ“œλŠ” 이진 검색 μ•Œκ³ λ¦¬μ¦˜μ˜ 기본적인 κ΅¬ν˜„μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

이진 검색 μ•Œκ³ λ¦¬μ¦˜
def binary_search(arr, target): # 검색 λ²”μœ„μ˜ μ‹œμž‘κ³Ό 끝 인덱슀 left, right = 0, len(arr) - 1 # 검색 λ²”μœ„κ°€ μ’ν˜€μ§ˆ λ•ŒκΉŒμ§€ 반볡 while left <= right: # 쀑간 인덱슀 계산 mid = (left + right) // 2 # 쀑간 κ°’ 확인 mid_value = arr[mid] # 쀑간 값이 λͺ©ν‘œ κ°’κ³Ό μΌμΉ˜ν•˜λŠ” 경우 if mid_value == target: # 인덱슀 λ°˜ν™˜ return mid # 쀑간 값이 λͺ©ν‘œ 값보닀 μž‘μ€ 경우 elif mid_value < target: # 였λ₯Έμͺ½ μ ˆλ°˜μ„ 탐색 left = mid + 1 # 쀑간 값이 λͺ©ν‘œ 값보닀 큰 경우 else: # μ™Όμͺ½ μ ˆλ°˜μ„ 탐색 right = mid - 1 return -1 # 값을 찾지 λͺ»ν•œ 경우 # μ •λ ¬λœ 리슀트 numbers = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] # 이진 κ²€μƒ‰μœΌλ‘œ 7 μ°ΎκΈ° result = binary_search(numbers, 7) # 3 좜λ ₯ (인덱슀 3 μœ„μΉ˜μ— κ°’ 7이 있음) print(f"μ°ΎλŠ” κ°’μ˜ 인덱슀: {result}")

μ½”λ“œ μ„€λͺ…

  • left와 right: 리슀트의 검색 λ²”μœ„λ₯Ό μ§€μ •ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€. μ²˜μŒμ—λŠ” 리슀트의 μ‹œμž‘(0)κ³Ό 끝(len(arr) - 1)을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

  • mid: 검색 λ²”μœ„μ˜ 쀑간 인덱슀λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€. (left + right) // 2λŠ” 쀑간 값을 κ΅¬ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

  • mid_value: 쀑간 μΈλ±μŠ€μ— μœ„μΉ˜ν•œ 값을 μ˜λ―Έν•©λ‹ˆλ‹€. 이 값을 λͺ©ν‘œ κ°’(target)κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€.

  • left = mid + 1: λͺ©ν‘œ 값이 쀑간 값보닀 크닀면, 검색 λ²”μœ„λ₯Ό 였λ₯Έμͺ½ 절반으둜 μ’νž™λ‹ˆλ‹€.

  • right = mid - 1: λͺ©ν‘œ 값이 쀑간 값보닀 μž‘λ‹€λ©΄, 검색 λ²”μœ„λ₯Ό μ™Όμͺ½ 절반으둜 μ’νž™λ‹ˆλ‹€.

  • return -1: λ§Œμ•½ 값을 찾지 λͺ»ν•œ 경우, -1을 λ°˜ν™˜ν•˜μ—¬ 검색 μ‹€νŒ¨λ₯Ό μ•Œλ¦½λ‹ˆλ‹€.

Mission
0 / 1

이진 검색 μ•Œκ³ λ¦¬μ¦˜μ˜ μ£Όμš” νŠΉμ§•μ€ λ¬΄μ—‡μΈκ°€μš”?

데이터λ₯Ό 순차적으둜 νƒμƒ‰ν•©λ‹ˆλ‹€.
λͺ¨λ“  λ°μ΄ν„°μ—μ„œ 항상 λ™μΌν•œ μœ„μΉ˜μ—μ„œ 검색을 μ‹œμž‘ν•©λ‹ˆλ‹€.
λ°μ΄ν„°μ˜ 쀑간 값을 ν™•μΈν•˜λ©° 검색 λ²”μœ„λ₯Ό 절반으둜 μ€„μž…λ‹ˆλ‹€.
μ •λ ¬λ˜μ§€ μ•Šμ€ λ¦¬μŠ€νŠΈμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Guidelines

AI Tutor

Publish

Design

Upload

Notes

Favorites

Help

Code Editor

Run
Generate

Execution Result