[백준][Python] 1920. 수 찾기
Silver Ⅳ 🔗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을 출력한다.
✏️문제 풀이
- 입력
n
을 입력- n개의 정수를 저장할
a
리스트 m
입력- m개의 정수를 저장할
x
리스트
- 이진 탐색을 위해 리스트 a 오름차순 정렬
- 이진 탐색 함수
binary_search()
선언- 탐색 범위의 시작(
0
)과 끝(len(arr) - 1
) 인덱스left
,right
left
인덱스가right
보다 커질때까지 반복- 현재 탐색 범위의 중간 인덱스(처음과 끝을 더하여 2로 나눈 몫)
- 찾는 숫자를 발견한 경우 1을 반환
- 중간값이 찾는 숫자보다 작은 경우, 오른쪽 범위 탐색(+1)
- 중간값이 찾는 숫자보다 큰 경우, 왼쪽 범위 탐색(-1)
- 숫자를 찾지 못한 경우 0을 반환
- 탐색 범위의 시작(
x
를 순회하여 이진탐색 수행
코드와 함께 보는 풀이
# n을 입력
n = int(input())
# n개의 정수를 저장할 a 리스트
a = list(map(int, input().split()))
# m 입력
m = int(input())
# m개의 정수를 저장할 x 리스트
x = list(map(int, input().split()))
# 이진 탐색을 위해 리스트 a 오름차순 정렬
a.sort()
# 이진 탐색 함수 선언
def binary_search(target, arr):
# 탐색 범위의 시작과 끝 인덱스
left, right = 0, len(arr) - 1
# left 인덱스가 right보다 커질때까지 반복
while left <= right:
# 현재 탐색 범위의 중간 인덱스
mid = (left + right) // 2
# 찾는 숫자를 발견한 경우 1을 반환
if arr[mid] == target:
return 1
# 중간값이 찾는 숫자보다 작은 경우, 오른쪽 범위 탐색
elif arr[mid] < target:
left = mid + 1
# 중간값이 찾는 숫자보다 큰 경우, 왼쪽 범위 탐색
else:
right = mid - 1
# 숫자를 찾지 못한 경우 0을 반환
return 0
# x를 순회하여 이진탐색 수행
for i in x:
print(binary_search(i, a))
💯제출 코드
n = int(input())
a = list(map(int, input().split()))
m = int(input())
x = list(map(int, input().split()))
a.sort()
def binary_search(target, arr):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return 1
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return 0
for i in x:
print(binary_search(i, a))
댓글남기기