https://www.acmicpc.net/problem/1920
N = int(input())
A = list(map(int, input().split()))
M = int(input())
arr = list(map(int, input().split()))
for i in arr:
print(1 if i in A else 0)
in
연산을 사용해 매번 전체를 탐색하기 때문에 시간이 오래 걸린다.bisect
사용)
import bisect
N = int(input())
A = sorted(list(map(int, input().split())))
M = int(input())
arr = list(map(int, input().split()))
for i in arr:
idx = bisect.bisect_left(A, i)
if idx < len(A) and A[idx] == i: print(1)
else: print(0)
bisect
모듈을 사용해보았다.bisect_left(arr, num)
: 정렬된 arr
에 대해, 값 num
을 삽입했을 때 정렬 순서를 유지할 수 있는 가장 왼쪽 인덱스르 반환arr = [1, 2, 3, 4, 5]
에 대해num = 2
-> bisect_left(arr, num) = 1
num = 4
-> bisect_left(arr, num) = 3
set
사용)N = int(input())
A = set(map(int, input().split()))
M = int(input())
arr = list(map(int, input().split()))
for i in arr:
print(1 if i in A else 0)
A
만 set
로 변경해주었다.in
연산 (membership tesing)의 평균 시간 복잡도는 O(n)이다.in
연산의 평균 시간 복잡도는 O(1)이다.bisect
모듈은 이진 탐색 구현을 도와준다.bisect
의 사용 예제는 다음과 같다. (출처: GPT o1)import bisect
lst = [1, 2, 4, 5, 7, 10] # list는 반드시 정렬돼있어야 한다!!
pos_left = bisect.bisect_left(lst, 3)
print("bisect_left:", pos_left) # bisect_left: 2
pos_right = bisect.bisect_right(lst, 5)
print("bisect_right:", pos_right) # bisect_right: 4
pos = bisect.bisect(lst, 5)
print("bisect:", pos) # bisect: 4
bisect.insort_left(lst, 3)
print("insort_left:", lst) # insort_left: [1, 2, 3, 4, 5, 7, 10]
bisect.insort_right(lst, 5)
print("insort_right:", lst) # insort_right: [1, 2, 3, 4, 5, 5, 7, 10]
bisect 미쳤네용