728x90
https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
가장 기본적인 이진탐색(이분탐색)문제이다.
해당 문제의 경우 100,000밖에 되지않기 때문에 순차탐색으로 풀어도되지만
이진탐색이 훨씬 효율적이므로 이진탐색으로 풀이한다
이진탐색은 기본적으로 정렬이 되어있는 상태여야한다.
재귀함수로 풀이해도되고 반복문으로 풀이해도 무관하다
#반복문으로 풀이
n = int(input())
arr1 = list(map(int, input().split()))
m = int(input())
arr2 =list(map(int, input().split()))
arr1.sort() #리스트 정렬
def search(array, target, start, end):
#반복문으로 풀이
while start <= end: #
mid = (start + end) // 2 #중간값
if array[mid] == target: #찾은 경우 중값값 리턴
return mid
elif array[mid] > target: #찾는 값이 더 작은 경우
end = mid - 1 #왼쪽 값을 확인해야하므로 끝값을 조정
else: #찾는 값이 더 큰경우
start = mid + 1 #오른쪽 값을 확인해야하므로 시작값을 조정
return None
for i in arr2:
result = search(arr1, i, 0, n - 1)
if result != None:
print(1)
else:
print(0)
간결한 방식으로는 set 자료형을 써서 풀이할 수 있다.
n = int(input())
array = set(map(int, input().split())) #set 자료형 작성
m = int(input())
array2 = list(map(int, input().split()))
for i in array2:
if i in array: #찾은 경우
print(1)
else:
print(0)
728x90
반응형
'Coding Test' 카테고리의 다른 글
백준 2512 - 예산 ( Python ) (1) | 2023.01.10 |
---|---|
백준 2805 - 나무 자르기( Python ) (0) | 2023.01.06 |
백준 1463 - 1로 만들기( Python ) (0) | 2022.12.24 |
백준 11727 - 2×n 타일링 2 (Python) (0) | 2022.12.19 |
백준 17478 - 재귀함수가 뭔가요? (0) | 2022.12.17 |