이진탐색이란 '정렬된 자료'를 반으로 쪼개가며 원하는 값을 찾아가는 탐색 알고리즘이다.
반드시 정렬되어있는 배열에서만 탐색 가능하다. 시간복잡도는 O(logN)
이다.
주로 left와 right
또는 low와 high
또는 start,end
로 변수 이름을 쓴다.
가운데 지점(mid)
을 찾고, 계속 left, right
값을 mid
를 이용해 갱신하면서 범위를 좁혀나가는 알고리즘이다.
n개의 원소를 가지는 정렬된 배열 A가 있을 때, 찾으려는 값 K와 가운데 값을 비교했을 때,
K가 더 작다면 반드시 K는 A[0] ~ A[mid-1] 에 존재할 것이다.
K가 더 크다면 반드시 K는 A[mid+1] ~ A[n-1] 에 존재할 것이다.
K를 구할 때 까지 반복하면 구간이 점점 줄어들면서 마침내 A[mid]==K 일때, 탐색이 종료된다.
이 반복을 반복문을 통해 구현할 수 있고, 재귀를 통해 구현할 수도 있다.
#이분탐색 알고리즘 (정방향)
def BinarySearch(arr,target):
#L: left, R: Right, M: Mid
L,R = 0, len(arr)-1
while(L <= R): # L>R 되면 탈출 (배열에 target이 없다)
M = (L + R) // 2
if(arr[M] == target): # target값에 해당하는 idx 찾음
return M
elif(arr[M] > target): # target 값보다 더 클 때
R = M - 1 # R을 중간-1 의 idx로 갱신
else: #target 값보다 더 작을 때
L = M + 1 # L을 중간+1 의 idx로 갱신
return -1 #배열 내에 값이 없음
#이분탐색 알고리즘 (재귀)
def BinarySearch(arr, target, left, right):
if left > right: #배열 내에 값이 없음
return -1
mid = (left + right) // 2
if arr[mid] > target: # target 값보다 더 클 때
#right 값을 mid-1로 대체하여 함수 호출
return BinarySearch(arr, target, left, mid-1)
if arr[mid] == target: # target 값에 해당하는 idx 찾음
return mid
if arr[mid] < target: # target 값보다 더 작을 때
#left 값을 mid+1로 대체하여 함수 호출
return BinarySearch(arr, target, mid + 1, right)
import sys
def BinarySearch(arr,target):
#L: left, R: Right, M: Mid
L,R = 0, len(arr)-1
while(L <= R): # L>R 되면 탈출 (배열에 target이 없다)
M = (L + R) // 2
if(arr[M] == target): # target값에 해당하는 idx 찾음
return M
elif(arr[M] > target): # target 값보다 더 클 때
R = M - 1 # R을 중간-1 의 idx로 갱신
else: #target 값보다 더 작을 때
L = M + 1 # L을 중간+1 의 idx로 갱신
return -1 #배열 내에 값이 없음
n=int(sys.stdin.readline())
a=list(map(int,sys.stdin.readline().rstrip().split()))
m=int(sys.stdin.readline())
b=list(map(int,sys.stdin.readline().rstrip().split()))
#사실 n,m값은 필요 없기 때문에 입력을 조금 더 간단하게 해결할 수 있다.
a=sorted(a)
for i in b:
print(BinarySearch(a,i))