알고리즘/파이썬

[파이썬 알고리즘] 이코테 - 부품찾기

귤먹는코더 2022. 5. 28. 22:08
728x90

문제)

동빈이네 전자 매장에는 부품이 N개 있다. 각 부품은 정수 형태의 고유한 번호가 있다. 어느 날 손님이 M개 종류의 부품을 대량으로 구매하겠다며 당일 날 견적서를 요청했다. 동빈이는 때를 놓치지 않고 손님이 문의한 부품 M개 종류를 모두 확인해서 견적서를 작성해야 한다. 이때 가게 안에 부품이 모두 있는지 확인하는 프로그램을 작성해보자.

 

가게의 부품이 총 5

N = 5

[8, 3, 7, 9, 2]

 

손님은 총 3개의 부품이 있는지 확인요청

N = 3

[5, 7, 9]

 

Output:

No yes yes

 

접근 방식)가게의 부품을 sort 함수를 이용해 오름차순으로 정렬시키고 target을 손님의 요청사항 하나하나씩 이진탐색을 써서 찾아보자!

 

코드 1) 이진탐색

def binary_search(nums, target):
    def bs(start, end):
        if start > end:
            return -1

        mid = (start + end) // 2

        if nums[mid] < target:
            return bs(mid + 1, end)
        elif nums[mid] > target:
            return bs(start, mid - 1)
        else:
            return mid

    return bs(0, len(nums) - 1)


n = int(input())
array = list(map(int, input().split()))
array.sort()

m = int(input())
x = list(map(int, input().split()))

for i in x:
    result = binary_search(array, i)

    if result != -1:
        print('yes', end=' ')
    else:
        print('no', end=' ')





 

2) 계수 정렬(이코테)

# N(가게의 부품 개수)을 입력받기
n = int(input())
array = [0] * 1000001

# 가게에 있는 전체 부품 번호를 입력받아서 기록
for i in input().split():
    array[int(i)] = 1

# M(손님이 확인 요청한 부품 개수)을 입력받기
m = int(input())
# 손님이 확인 요청한 전체 부품 번호를 공백으로 구분하여 입력
x = list(map(int, input().split()))

# 손님이 확인 요청한 부품 번호를 하나씩 확인
for i in x:
    # 해당 부품이 존재하는지 확인
    if array[i] == 1:
        print('yes', end=' ')
    else:
        print('no', end=' ')
728x90