수 찾기
스타트 택시를 오늘 내로 풀고 포스팅 하는게 목표였지만, 끝내 풀지 못해서 가벼운 이분탐색 문제를 가져왔다.😢
문제분석
정말 말 그대로 이분탐색이다.
[1, 3, 4, 5, 7, 8, 9, 11, 12]에서 이분 탐색으로 4를 찾는 과정에 대해 그림을 그려봤다.(이분 탐색을 할 때 리스트는 정렬된 상태여야 한다!)
-
초기에 양끝 포인터는 0번째와 8번째 요소를 가리키고 있다. 이제 그 가운데인 4번째 요소를 살펴보자. 4번째 요소는 7로 4보다 크다. 따라서 4는 0~3중에 있다고 생각할 수 있다.
-
위의 과정을 반복해보자. 0과 3의 가운데인 1(=(0+3)//2)을 살펴보면, 1번째 요소는 3으로 4보다 작다. 따라서 4는 2~3중에 있다.
-
2와 3의 가운데인 2를 살펴보자. 2번째 요소는 4로 우리가 찾고있는 수와 일치한다!
순차탐색을 활용하면 시간복잡도가 0(n)이고, 이분탐색을 통해 원소를 탐색하면, O(logN)내에 탐색할 수 있다. 이분탐색은 리스트가 정렬되어 있는 상태에서만 쓸 수 있다는 점에 유의하자.
CODE
import sys
read = sys.stdin.readline
n = int(read())
A = list(map(int, read().split()))
A.sort()
m = int(read())
num = list(map(int, read().split()))
def binsearch(x):
if x > A[-1] or x < A[0]:
return 0
if x == A[-1] or x == A[0]:
return 1
l, r = 0, n-1
while l <= r:
mid = (l+r)//2
if A[mid] == x:
return 1
elif A[mid] < x:
l = mid+1
else:
r = mid-1
return 0
# 이렇게 while문 다 돌고 나서도 x를 찾지 못한 경우에
# 0을 return해줘야 하는데 이걸 생각못했었다.
for i in num:
print(binsearch(i))
틀린 부분이 있을 수 있습니다. 피드백 주시면 고치도록 하겠습니다! 감사합니다.👍
[꼭 다시 풀어보기]