크래프톤정글이야기/TIL - WIL
[TIL-250523] 이진탐색
Study & Stack
2025. 5. 23. 23:27
728x90
이진탐색이란?
- 둘로 나눠 탐색하는 방법을 일컫는다. 즉, 정렬된 데이터에서 원하는 값을 찾기 위해 범위를 계속 반으로 좁혀가는 방법
*주의 할 점은 정렬되어야 한다는 것
기본구조
def binary_search(arr, target): start = 0 end = len(arr) - 1 while start <= end: mid = (start + end) // 2 if arr[mid] == target: return mid # 찾은 위치의 인덱스 반환 elif arr[mid] < target: start = mid + 1 # 오른쪽 탐색 else: end = mid - 1 # 왼쪽 탐색 return -1 # 못 찾은 경우 |
예시)
arr = [ 2,4,7,9,12,15,20] target = 12 |
arr 리스트에서 12라는 값을 찾고 싶다고 할때 브루트포스 방식으론, 하나씩 인덱스를 비교하며 찾아야한다.
이진탐색
arr = [2, 4, 7, 9, 12, 15, 20] ↑ ↑ ↑ start mid end |
처음엔 Start = 0, end =6(리스트길이 -1)
mid =(start + end) // 2
= (0+6) // 2 = 3
즉 mid 값은 9가 되는 것!
- 우리가 찾는 값은 12는 9보다 크니까 오른쪽에 있을 것이다.
start = mid + 1 = 4 그래서 스타트 인덱스를 옮겨 12부터 탐색한다.
arr = [2, 4, 7, 9, 12, 15, 20] ↑ ↑ start end |
- 다시 mid = (4 + 6) // 2 = 5
- arr[5] = 15 → 너무 크다! 12보다 작아야 한다. → end = mid - 1 = 4
arr = [2, 4, 7, 9, 12, 15, 20] ↑ start=end=4 |
핵심요약
용어 의미
start | 탐색 구간의 왼쪽 끝 인덱스 |
end | 탐색 구간의 오른쪽 끝 인덱스 |
mid | start와 end의 중간 인덱스 |
target | 우리가 찾고자 하는 값 |
조건 | arr[mid] == target이면 정답 |
🛠️ 어디에 쓰일까?
- 정렬된 데이터에서 값이 있는지 확인
- 파라메트릭 서치 (범위를 설정해서 최적값 찾기)
- 문제: 백준 1920, 1654, 2805, 2110 등
📚 마지막 정리!
초기 상태: 2 4 7 9 12 15 20 ↑ mid=3 (arr[3]=9) 1단계 후: 12 15 20 ↑ mid=5 (arr[5]=15) 2단계 후: 12 ↑ mid=4 (arr[4]=12) |
728x90