정리 내용
이진 탐색이란
- binary search (반으로 쪼개면서 탐색하기)
- 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있다.
- 데이터가 무작위일때는 사용할 수 없다.
- 탐색 범위를 절반씩 좁히면서 데이터를 탐색하는 특징이 있다.
- 이진 탐색은 변수 3개를 사용하여 구현하는데 변수는 시작점, 끝점, 중간점을 사용한다.
- 찾으려는 데이터와 중간점(middle) 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는다.
- 시작점과 끝점, 중간점을 정할 때 중간점이 실수일 때는 소수점 이하를 버린다.
- 시간 복잡도가 O(logN)이다.
- 절반씩 데이터를 줄어들도록 만든다는 점에서 퀵 정렬과 공통점이 있다.
- 이진 탐색을 구현하는 방법은 2가지가 있다.
1) 재귀 함수를 이용한 구현
2) 반복문을 이용한 구현
- 코딩 테스트에서 이진 탐색 문제는 탐색 범위가 큰 상황에서 탐색을 가정하는 문제가 많다
- 탐색(data) 범위가 2000만을 넘어가면 이진 탐색으로 접근해보자
재귀 함수로 구현한 이진 탐색 소스코드
def binary_search(array, target, start, end):
if start > end:
return None
mid = (start + end) // 2
if array[mid] == target:
return mid
elif array[mid] > target:
return binary_search(array, target, start, mid-1)
else:
return binary_search(array, target, mid+1, end)
n, target = list(map(int, input().split()))
array = list(map(int, input().split()))
result = binary_search(array, target, 0, n-1)
if result == None:
print("원소가 존재하지 않습니다")
else:
print(result+1)
반복문으로 구현한 이진 탐색 소스코드
def binary_search(array, target, start, end):
while start <= end:
mid = (start + end) // 2
if array[mid] == target:
return mid
elif array[mid] > target:
end = mid - 1
else:
start = mid + 1
return None
n, target = list(map(int, input().split()))
array = list(map(int, input().split()))
result = binary_search(array, target, 0, n-1)
if result == None:
print("원소가 존재하지 않습니다")
else:
print(result+1)
출처 & 깃허브
이것이 취업을 위한 코딩 테스트다 with python
github