탐색
이분 탐색
업-다운 게임 잘하는 법
제가 1~100 중 하나를 정했습니다. 몇 번 만에 맞히는지 해 보세요.
1남은 후보 100개100
50
가운데를 부르면 절반이 날아갑니다. 어느 쪽 답이 오든 똑같습니다.
100 → 50 → 25 → 13 → 7 → 4 → 2 → 1일곱 번. 운이 나빠도 일곱 번.
매번 절반씩 버리는 방법 = 이분 탐색
이분 탐색은 정렬된 줄에서만 쓸 수 있다
- 버릴 수 있던 이유 — 왼쪽이 전부 더 작다고 알기 때문
- 섞여 있으면 — 가운데가 작아도 왼쪽에 큰 수가 있다. 못 버린다
- 신호— 문제에 “오름차순으로 주어진다”
코드는 방금 한 게임을 그대로 옮긴 것이다
배열에서 42 찾기. 다음을 눌러 한 줄씩 넘겨 보세요.
70
121
192
233
314
425
556
687
718
909
leftright
다음을 눌러 한 줄씩 넘겨 보세요
left = 0 right = 9
binary_search.py
- 1def binary_search(arr, target):
- 2 left, right = 0, len(arr) - 1
- 3 while left <= right:
- 4 mid = (left + right) // 2
- 5 if arr[mid] == target:
- 6 return mid
- 7 elif arr[mid] < target:
- 8 left = mid + 1
- 9 else:
- 10 right = mid - 1
- 11 return -1
0 / 15
leftright— 아까 막대의 양 끝mid— 여러분이 부른 수
42 대신 12를 찾는다면, 첫 질문 뒤에 어느 쪽이 버려질까요?
이분 탐색은 경계에서 틀린다
<=에서 등호를 빼면 — 한 칸 남았을 때 그 칸을 안 본다. 있어도 “없다”mid + 1에서+1을 빼면 — 범위가 안 줄어든다. 무한 루프
위 플레이어에서 한 칸 남는 순간을 다시 돌려 보세요. 전부 거기서 틀립니다.
이분 탐색을 꺼내라는 세 가지 신호
정렬돼 있다값 하나를 찾는다N이 너무 크다
다음 장에서는 찾는 값이 여러 개일 때 그중 첫 번째를 어떻게 찾는지 봅니다.