728x90
반응형
문제:
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안에 존재하는지 알아내면 된다. 모든 정수들의 범위는 int로 한다.
출력:
M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
풀이 방법:
binary_search를 사용하는 문제이다. python에 이진탐색을 지원하는 bisect라는 모듈이 있다. 따라서 이를 사용하면 쉽게 문제를 풀 수 있다. bisect의 모듈은 binary search를 직접적으로 지원을 하지 않기 때문에 따로 만들어줘야 한다. bisect에 bisect_left(arr,x)와 bisect_right(arr,x)가 있는데, 각각 arr에 x를 넣어야 할 때 어느 인덱스에 넣어야 할지 알려주는 함수이다.(left는 왼쪽에, right는 오른쪽에) 따라서 bisect_left를 사용하면 binary_search를 구현할 수 있다. 만약 기존 arr에 있는 값을 찾는다고 하면(넣으려고 한다면) 왼쪽 인덱스를 반환해주므로 원래의 위치를 return 해준다. 따라서 그 인덱스에 해당하는 배열 값과 x가 같으면 존재하고, 같지 않다면 존재하지 않다고 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import bisect def binary_search(arr,x): i = bisect.bisect_left(arr,x) return i < len(arr) and arr[i]==x n=int(input()) arr = list(map(int,input().split())) arr.sort() m=int(input()) check=list(map(int,input().split())) for i in range(m): if binary_search(arr,check[i]): print(1) else: print(0) | cs |
728x90
반응형
'Algorithm > Python' 카테고리의 다른 글
[BOJ]1654.랜선 자르기 (0) | 2019.07.26 |
---|---|
[BOJ]10816. 숫자 카드2 (0) | 2019.07.25 |
[BOJ]2075. N번째 큰 수 (0) | 2019.07.23 |
[BOJ] 11279,1927,11286 최대힙,최소힙,절대값 힙 (0) | 2019.07.21 |
[BOJ]2606. 바이러스 (0) | 2019.07.20 |