3개지 변수 시작점, 중간점, 끝점을 이용하여 찾으려는 데이터와 중간점에 위치한 데이터를 반복적으로 비교하여 원하는 데이터를 찾는 것
탐색 범위가 2000만을 넘어가면 이진 탐색을 떠올려보자 => log(n)의 시간 복잡도가 필요한 경우
# 재귀 함수를 통한 이진 탐색
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_sort(array, target, start, mid - 1)
# 중간 지점의 데이터가 찾는 데이터보다 작은 경우
else:
return binary_sort(array, target, mid + 1, end)
# n(원소의 개수)과 target(찾고자 하는 문자열)을 입력하기
n, target = 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(찾고자 하는 문자열)을 입력하기
n, target = 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)
'Algorithm' 카테고리의 다른 글
| 람다 표현식 (0) | 2021.04.26 |
|---|---|
| 트리 자료구조 - 이진 탐색 트리 (0) | 2021.04.16 |
| BOJ - 15649번 - N과 M (1) (0) | 2021.04.15 |
| BOJ - 18870번 - 좌표 압축 (0) | 2021.04.08 |
| BOJ - 11651번 - 좌표 정렬하기 2 (0) | 2021.04.08 |