공부 : 동빈나 유튜브 ( https://youtu.be/94RC-DsGMLo?list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC )
이진탐색 : 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터 탐색
- 시작점, 끝점, 중간점
- 정렬되어 있어야 가능
- 단계마다 탐색 볌위를 2로 나누는 것과 동일 -- O(logN)
- 이진탐색은 재귀함수 또는 반복문을 통해 풀 수 있음
#재귀함수버전
def binarySearch(array, target, start, end):
if target < array[start]: # start > end로 멈출수도 있음
return None
mid = (end+start)//2
if array[mid] == target:
return mid
elif array[mid] < target:
return binarySearch(array, target, mid + 1, end)
elif array[mid] > target:
return binarySearch(array, target, start, mid - 1)
n, target = list(map(int, input().split()))
numList = list(map(int, input().split()))
a = binarySearch(numList, target, 0, n-1)
if a != None:
print(a-1)
else:
print(a)
파이썬 이진 탐색 라이브러리
- bisect_left(a, x) : 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 왼쪽 인덱스 반환
- bisect_right(a,x) : 정렬된 순서를 유지하면서 배열 a에 x를 삽입할 가장 오른쪽 인덱스 반환
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x)) #출력값 : 2
print(bisect_right(a, x)) #출력값 : 4
파라메트릭 서치 (Parametric Search)
: 최적화 문제를 결정 문제('예' 혹은 '아니오')로 바꾸어 해결하는 기법
--> 일반적으로 코딩 테스트에서 파라메트릭 서치문제는 이진탐색을 이용하여 해결 가능
백준 - 이진탐색 문제
연습 코드 : https://github.com/mingxoxo/Algorithm/tree/master/study/이진탐색
GitHub - mingxoxo/Algorithm: 알고리즘
알고리즘. Contribute to mingxoxo/Algorithm development by creating an account on GitHub.
github.com
'study > 알고리즘' 카테고리의 다른 글
[알고리즘] 구현 : 시뮬레이션과 완전 탐색 (0) | 2021.11.10 |
---|---|
[알고리즘] DFS/BFS - 백준 1260번/2606번 (0) | 2021.11.09 |
[알고리즘] DFS/BFS (4) | 2021.11.08 |
[알고리즘] 그리디(Greedy) 알고리즘 (0) | 2020.10.11 |
[알고리즘] 파이썬 문법 복습 (0) | 2020.09.24 |