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 |