티스토리 뷰

https://www.acmicpc.net/problem/2776

2776번: 암기왕

연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,

www.acmicpc.net


👩‍💻문제 이해

이해하기에 어려운 문제는 아니다.
N개의 정수가 주어진 '수첩1'의 배열을 정렬한 후 '수첩2'에 들어있는 각각의 정수들을 이분탐색 알고리즘으로 '수첩1'에도 있는지 없는지를 판단하면 된다.


👩‍💻반복문을 사용해 이분탐색 알고리즘 구현 (함수 별도 구현) : 성공🌈

def binary(arr, target):
  start = 0
  end = len(arr) - 1
  while start <= end:
    mid = (start + end) // 2
    if target == arr[mid]:
      return 1
    elif target <= arr[mid]:
      end = mid - 1
    else:
      start = mid + 1
  return 0

t = int(input())
for i in range(t):
  n = int(input())
  nli = list(map(int, input().split()))
  nli = sorted(nli)
  m = int(input())
  mli = list(map(int, input().split()))
  start = 0
  end = len(nli) - 1

  for j in mli:
    print(binary(nli, j))


def binary(arr, target):
  start = 0
  end = len(arr) - 1
  
  # start와 end는 모두 인덱스 값임에 유의
  
  while start <= end:
    mid = (start + end) // 2
    if target == arr[mid]:
      return 1
      # 여기서 target은 수첩2에 있는 정수들
      # target이 중간값과 같을 때 1 return
      
    elif target <= arr[mid]: 
   	  # mid 또한 인덱스 값이므로 반드시 li[mid] 형태로 구현
      end = mid - 1
      
    else:
      start = mid + 1
      
  return 0
  # 수첩1에 해당 정수가 존재하지 않을 때 0 return


t = int(input())
for i in range(t):
  n = int(input())
  nli = list(map(int, input().split()))
  nli = sorted(nli)
  m = int(input())
  mli = list(map(int, input().split()))
  start = 0
  end = len(nli) - 1

  for j in mli:
    print(binary(nli, j))



Point

이분탐색 알고리즘에서 start, end, mid 변수가 인덱스 (값의 위치)일 때 li[start] 형태로 활용

댓글
최근에 올라온 글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday