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