오름차순으로 정렬된 배열 A가 있을 때, 43
을 binary Search로 찾기
A = {17, 28, 43, 67, 88, 92, 100}
(1) 가운데에 위치한 `67` 을 mid로 선택 하고 target인 `43` 과 비교함
=> mid > target (67>43)이므로, `43`은 `67` 보다 좌측에 위치하고 있음
(2) `67` 기준으로 좌측의 배열의 값 {17,28,43} 에서,
가운데에 위치한 `28` 을 선택하고 target인 `43` 과 비교함
=> mid < target (28<43) 이므로, `28` 보다 우측에 위치하고 있음
(3) `28`의 우측의 배열은 {43} 으로, taget과 mid의 값이 서로 일치함
Binary Search에서의 탐색의 종료조건은 '원하는 값을 찾으면 종료된다.
운이 좋게 처음에 찾을 수도 있지만, 계속해서 탐색하면서 찾아야 할 경우도 있다.
또한, 원하는 값이 배열에 존재하지 않는 경우가 있을 수 있다.
위와 같은 예시로 오름차순으로 정렬된 배열 A가 있을때 40
을 찾는 경우,
(1) 가운데 위치한 `67`을 mid로 선택하고 target 인 `40`과 비교한다.
위와 동일하게 mid > target (67>40) 이므로, `67` 보다 좌측으로 배열을 재설정한다.
(2) `67` 기준으로 좌측의 배열 값 {17,28,43} 에서 가운데 위치한 `28`을 선택하고,
target인 `40`과 비교했을 때 mid < target(28<40) 이므로, 28보다 우측에 위치한다.
(3) 이때 남은 배열인 {43}은 target `40` 보다 작아서,
배열의 좌측을 탐색해야 하지만 더이상 남은 배열이 없기 때문에 탐색을 종료한다.
즉, 이진 탐색의 종료 조건은 [1] 검색을 성공 할 경우 [2] 검색을 실패할 경우(더 이상 검색할 범위가 없을 때) 이다.
= Binary Search 는 [1] 반복문이용 [2] 재귀 로 구현 가능하다.
[1] 반복문 이용
def binarySearch(arr, target):
start, end = 0,0
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
[2] 재귀 함수 이용
def binarySearch_rec(arr, target, start, end):
if start > end:
return -1
mid = (start+end)//2
if arr[mid] == target:
return mid
elif arr[mid] < target:
return binarySearch_rec(arr, target, mid+1, end)
else:
return binarySearch_rec(arr, target, start, mid+1)
< 프로그래머스 >
< LeetCode >
[참고 사이트]