이진 탐색(Binary Search)은 탐색 범위를 반으로 좁혀가며 빠르게 탐색하는 알고리즘이다.
이진 탐색은 한 번 비교할 때마다 탐색 범위가 절반으로 줄어든다. 따라서 최악의 경우에도 O(logN) 의 시간 복잡도를 가진다.
이진 탐색을 구현하는 방법에는 크게 두 가지가 있다.
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, mid + 1, end)
else:
return binary_search(array, target, start, mid - 1)
# 입력 예시
n, target = map(int, input().split())
array = list(map(int, input().split()))
# 이진 탐색 실행
result = binary_search(array, target, 0, n - 1)
if result is 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:
start = mid + 1
else:
end = mid - 1
return None
# 입력 예시
n, target = map(int, input().split())
array = list(map(int, input().split()))
# 이진 탐색 실행
result = binary_search(array, target, 0, n - 1)
if result is None:
print('원소가 존재하지 않습니다.')
else:
print(result + 1)
sys.stdin.readline()위 코드에서 input()을 사용하면 실행 속도가 느려질 수 있다. 따라서, sys 라이브러리의 sys.stdin.readline()을 활용하면 시간 초과를 방지할 수 있다.
주의할 점
sys.stdin.readline()으로 입력을 받을 경우, 입력 후 개행 문자(\n) 가 포함된다.rstrip() 을 사용하여 개행 문자를 제거하는 것이 중요하다.import sys
# 하나의 문자열 데이터 입력받기
input_data = sys.stdin.readline().rstrip()
파라메트릭 서치(Parametric Search)는 최적의 값을 찾기 위해 특정 조건을 만족하는 값의 범위를 탐색하는 방법이다.
파라메트릭 서치는 이진 탐색을 응용한 문제 해결 방법이다.
def is_possible(mid):
# mid 값이 조건을 만족하는지 검사하는 함수 (문제에 따라 다름)
return some_condition(mid)
def parametric_search(start, end):
result = 0
while start <= end:
mid = (start + end) // 2
if is_possible(mid):
result = mid # 가능한 값이면 저장하고 더 큰 값 탐색
start = mid + 1
else:
end = mid - 1
return result
파라메트릭 서치는 이진 탐색을 기반으로 하는 최적화 기법이므로, 이진 탐색을 잘 이해하면 쉽게 응용할 수 있다.