www.acmicpc.net/problem/1920
문제
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)
'Algorithm(알고리즘) > BOJ(백준) 문제풀이' 카테고리의 다른 글
백준 10989번 파이썬 | 수 정렬하기 3 | Sort (0) | 2020.09.28 |
---|---|
백준 2751번 파이썬 | 수 정렬하기 2 | Sort (0) | 2020.09.28 |
백준 10994번 파이썬 | 별 찍기 -19 | 재귀함수 (1) | 2020.09.22 |
백준 1063번 파이썬 | 킹 | 시물레이션 (0) | 2020.09.18 |
백준 1946번 파이썬 | 신입 사원 | Greedy (0) | 2020.09.14 |