Algorithm/Baekjoon

[Python] 2776. 암기왕

느낌표 공장장 2021. 10. 20. 23:14
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