코딩테스트 문제풀이
[이것이 코딩테스트다] 이진탐색 부품찾기
꿈꿈개
2022. 8. 11. 14:02
입력 조건
- 첫째 줄에 정수 N이 주어짐 (1<=N<=1,000,000)
- 둘째 줄에는 공백으로 구분하여 N개의 정수가 주어짐. 정수는 1보다 크고 1,000,000이하
- 셋째 줄에는 정수 M이 주어짐 (1<=M<=1,000,000)
- 넷째 줄에는 공백으로 구분하여 N개의 정수가 주어짐. 정수는 1보다 크고 1,000,000이하
출력 조건
- 첫째 줄에는 공백으로 구분하여 각 부품이 존재하면 yes를 , 없으면 no를 출력
해결방법
탐색 문제로 여러가지 방법으로 풀 수 있다.
책에서는 이진탐색, 계수탐색, 집합자료형 이용 세가지로 정리해놓았다.
제일 먼저 문제를 보고 집합자료형 이용을 할까 생각했지만 앞서 공부한 이진탐색을 이용해보고자 이진탐색 재귀함수를 이용해서 구현하였다.
코드 구현
#N개의 숫자가 들어있는 배열 A
#M개의 숫자가 들어있는 배열 B
# A에 B에 있는 데이터와 일치한 것이 있는지 확인
#이진탐색으로 풀어야겠다
#이진탐색 함수
def bineory_search(array, target, start, end) :
mid=(start+end)//2
if start>end :
return None
else :
if array[mid]==target :
return mid
elif array[mid]<target :
return bineory_search(array, target, mid+1, end)
elif array[mid]>target :
return bineory_search(array, target, start, mid-1)
return None
n=int(input())
a=list(map(int, input().split()))
m=int(input())
b=list(map(int, input().split()))
a=sorted(a)
#m의 데이터를 하나씩 이진탐색 함수에 넣고 결과출력
for i in range(m) :
result=bineory_search(a, b[i], 0, n-1)
if result==None :
print("no", end=" ")
else :
print("yes", end=" ")
난이도는 쉬운 문제이지만 다양한 방법으로 풀어보는 걸 연습하기 좋은 것 같다.