본문 바로가기
Algorithm(알고리즘)/BOJ(백준) 문제풀이

백준 1920번 파이썬 | 수 찾기 | binary search(이분 탐색)

by Jun_N 2020. 9. 26.

www.acmicpc.net/problem/1920

 

1920번: 수 찾기

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안��

www.acmicpc.net

문제

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

출력

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.


풀이

이 문제를 for 문으로 돌려서 무작정 찾게되면 시간초과로 틀리게 된다.

따라서 효율적으로 찾기 위해서 O(logn)인 이분 탐색(binary search) 알고리즘을 사용한다.

def BinarySearch(arr, val, low, high):
    if low > high:
        return False
    
    mid = (low + high) // 2
    if arr[mid] > val:
        return BinarySearch(arr, val, low, mid - 1)
    elif arr[mid] < val:
        return BinarySearch(arr, val, mid + 1, high)
    else:
        return True

import sys

N=int(sys.stdin.readline())
listN=list(map(int,sys.stdin.readline().rstrip().split()))
M=int(sys.stdin.readline())
listM=list(map(int,sys.stdin.readline().rstrip().split()))

listN.sort()

for i in listM:
  if BinarySearch(listN,i,0,N-1):
    print(1)
  else:
    print(0)