공부하자!/알고리즘
백준 10815 파이썬 숫자 카드
지우개원정대
2021. 6. 9. 01:14
처음에는 그냥 하나하나 다 탐색해야 하는 건 줄 알고 가볍게 풀었다.
import sys
N = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
B = list(map(int, sys.stdin.readline().split()))
for i in range(len(B)):
if B[i] in A:
B[i] = 1
else:
B[i] = 0
for i in B:
print(i, end=' ')
쉽다쉬워~
그런데 계속 시간초과가 뜬다.
알고리즘 뭐 쓰이는지 봤더니 이분탐색..!
주어지는 리스트의 크기가 작지 않은 이상 전체 탐색은 시간이 너무 오래 걸리는 것이었다
import sys
N = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split()))
M = int(sys.stdin.readline())
B = list(map(int, sys.stdin.readline().split()))
A.sort()
def binary_search(num):
l = 0
r = N - 1
while l <= r:
mid = (l + r) // 2
if A[mid] == num:
return 1
elif A[mid] > num:
r = mid - 1
else:
l = mid + 1
return 0
for i in B:
print(binary_search(i), end=' ')
왼쪽을 l, 오른쪽을 r 이라고 지정하고 가운데를 mid = (l + r) // 2로 정의
찾는 수는 num
찾는 수와 같으면 1을 리턴하고,
찾는 수가 mid 보다 더 작으면 왼쪽 반에서 다시 찾고 (r = mid - 1 로 다시 지정)
찾는 수가 mid 보다 더 크면 오른쪽 반에서 다시 찾는다 (l = mid + 1 로 다시 지정)
그리고 없다면 0을 리턴하면 된다