def binary_search(t_num):
s = 0 # 시작, 마지막 포인트 초기화
e = n1 - 1
while s <= e:
m = (s + e) // 2 # 중간지점 인덱스
if number1[m] == t_num: # 수첩 1에 숫자 있다면
return 1
elif number1[m] > t_num: # 중간지점 값이 목표 숫자보다 크다면
e = m - 1 # 시작 ~ 중간 범위 설정
else: # 중간지점 값이 목표 숫자보다 작다면
s = m + 1 # 중간 ~ 끝 범위 설정
return 0 # 수첩 1에 숫자 없는 경우
tc = int(input())
for _ in range(tc):
n1 = int(input()) # 수첩 1에 적어놓은 정수의 개수
number1 = sorted(set(map(int, input().split()))) # 수첩 1에 적힌 숫자들
n1 = len(number1)
n2 = int(input()) # 수첩 2에 적어놓은 정수의 개수
number2 = list(map(int, input().split())) # 수첩 2에 적힌 숫자들
for t_num in number2: # 수첩 2에 적혀있는 순서대로 수첩 1에 있는지 이진 탐색
print(binary_search(t_num))
- 수첩 1에 적힌 숫자들을 받아 올 때 set 대신 list로 받아와도 시간 초과가 나지 않는다. 그런데 set을 쓰는 게 더 빠른걸 보니, 중복 숫자가 많은 듯하다.
- 이진 탐색 코드를 함수로 만들지 않고, 그냥 맨 아래의 for문에 같이 넣었을 때에는 시간 초과가 났다.
그래서 함수로 분리시켰더니 시간초과가 나지 않았다. - 아래와 같이 수첩 1에 적힌 숫자들을 set으로 받아와 정렬하지 않고, for문을 돌 때 이진 탐색 대신 in으로 코드를 짜도 통과할 수 있다. (더 빠르다....)
-
for _ in range(int(input())): n1 = int(input()) number1 = set(map(int, input().split())) n2 = int(input()) number2 = list(map(int, input().split())) for target in number2: print(1 if target in number1 else 0)
-
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 1806. 부분 합 (0) | 2021.12.16 |
---|---|
[Python] 12015. 가장 긴 증가하는 부분 수열2 (0) | 2021.10.21 |
[Python] 2589. 보물섬 (0) | 2021.10.19 |
[Python] 9205. 맥주마시면서 걸어가기 (0) | 2021.10.19 |
[Python] 2293. 동전 1 (0) | 2021.10.02 |