이코테
[이코테 - 이진탐색] 부품 찾기
종식당
2024. 2. 5. 20:55
728x90
반응형
- 문제 설명
첫 번째 줄에 N을 입력받고 두 번째 줄에 N개의 부품을 입력받는다. 세 번째 줄에 M을 입력받고 네 번째 줄에 N개의 부품을 입력받은 후 N개의 부품이 M개 부품에 포함되는지 판단하여 포함되면 yes 안되면 no를 출력하면 된다.
- 개념 설명
문제를 풀기 전에 먼저 이진 탐색의 개념을 잡고 넘어가려 한다.
이진 탐색이란, 오름차순으로 정렬된 배열을 반복적으로 반으로 나누어 target이 선택될 때까지 탐색하는 알고리즘이다.
이때 이진 탐색을 사용할 때는 꼭 정렬된 상태에서 사용할 수 있다는 점을 기억해두자! 시간 복잡도는 O(logn)이다.
1. 반복문 사용
def binary_search(target, data):
data.sort()
start = 0 # 맨 처음 위치
end = len(data) - 1 # 맨 마지막 위치
while start <= end:
mid = (start + end) // 2 # 중간값
if data[mid] == target:
return mid # target 위치 반환
elif data[mid] > target: # target이 작으면 왼쪽을 더 탐색
end = mid - 1
else: # target이 크면 오른쪽을 더 탐색
start = mid + 1
return
2. 재귀 함수 사용
def binary_search(target, start, end):
if start > end: # 범위를 넘어도 못찾는다면 -1을 반환
return -1
mid = (start + end) // 2 # 중간값
if data[mid] == target: # 중간값의 데이터가 target과 같다면 mid를 반환
return mid
elif data[mid] > target: # target이 작으면 왼쪽 탐색
end = mid - 1
else: # target이 크면 오른쪽 탐색
start = mid + 1
return binary_search(target, start, end) # 줄어든 범위를 더 탐색
def solution(target, data):
data.sort() # 정렬(필수)
start = 0
end = len(data) - 1
return binary_search(target, start, end)
이진 탐색을 이용하는 알고리즘은 거의 위 코드를 사용하므로 암기해두면 좋을 것 같다!
그럼 다시 문제로 돌아와서 위 코드를 이용해 문제를 풀어보겠다.
- 문제 코드
def binary_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
N = int(input())
N_lst = list(map(int,input().split()))
N_lst.sort()
M = int(input())
M_lst = list(map(int,input().split()))
for i in M_lst:
result = binary_search(N_lst,i,0,N-1)
if result != None:
print("yes",end=" ")
else:
print("no",end=" ")
- 느낀점
아직 문제를 보고 이진 탐색을 필요로 하는지 생각이 나는 수준이 아니기 때문에 관련 문제를 많이 풀어봐야 할 것 같고 혹시라도 정렬이 되어 있는 형태로 문제가 주어진다면 이진 탐색을 먼저 생각해야겠다. 그리고 위 형식의 코드를 익숙하게 사용하기 위해 암기를 하면 도움이 많이 될 것 같다.
728x90
반응형