Binary Search: 이진 탐색 / 이분 탐색
정렬된 데이터가 있을 때 중간부터 탐색을 시작하여 탐색할 문제를 점차 반씩 줄여가는 방식이다.Binary Search의 특징
데이터가 정렬되어 있어야 한다.시간복잡도
Best :
Average :
Worst :
검색이 반복될 때마다 검색 범위가 절반으로 줄기 때문에 속도가 빠르다.
정렬된 리스트에만 사용할 수 있다.
완전 탐색으로 풀면 시간 초과가 나는 경우 이진탐색을 통해 해결되는 경우가 많다.
탐색하고자 하는 데이터가 정렬되어 있어야 한다. 즉, 정렬되지 않은 데이터라면 먼저 정렬을 수행해야 한다.
문제에서 구하려고 하는 값의 범위를 고려하여 이진 탐색의 범위로 할당한다.
구현은 두 가지 방법으로 할 수 있다.
1. 재귀(recursion)
2. 반복(iteration)
: 함수 프롤로그와 에필로그의 오버헤드를 줄일 수 있는 반복(iteration) 방식으로 구현하는 것이 성능이 일반적으로 더 좋고 간편하다.
동작 방식
종료 조건
두 가지 중 한 가지를 만족한다면 탐색을 종료한다.
검색을 성공한 경우
: array[mid] == key
검색을 실패한 경우
: low >= high
import sys
input = sys.stdin.readline
N = int(input())
city = list(map(int, input().split()))
total_budget = int(input())
start, end = 0, max(city)
mid = (start + end) // 2
while start <= end:
# 상한가가 mid일 때 사용될 예산 총 값 구하기
use_budget = 0
for i in range(N):
if mid < city[i]:
use_budget += mid
else:
use_budget += city[i]
# binary search
if use_budget == total_budget:
break
elif use_budget > total_budget:
end = mid - 1
mid = (start + end) // 2
else:
start = mid + 1
mid = (start + end) // 2
print(mid)
<BAEKJOON: 골드 2> 가장 긴 증가하는 부분 수열 2
<BAEKJOON: 실버 4> 암기왕
<BAEKJOON: 실버 3> 게임
<BAEKJOON: 실버 3> 먹을 것인가 먹힐 것인가
<BAEKJOON: 실버 2> 용돈 관리
<BAEKJOON: 실버 1> 접두사 찾기
<BAEKJOON: 골드 5> 용액
<BAEKJOON: 골드 4> 휴게소 세우기
<BAEKJOON: 골드 3> 세 용액
<BAEKJOON: 골드 3> 두 배열의 합
<BAEKJOON: 골드 1> 냅색문제