-
문제 - 배달의 민족 배달 가능 여부개발일지/알고리즘 2021. 12. 27. 20:26
# 문제
Q. 배달의 민족 서버 개발자로 입사했다. 상점에서 현재 가능한 메뉴가 ["떡볶이", "만두", "오뎅", "사이다", "콜라"] 일 때, 유저가 ["오뎅", "콜라", "만두"] 를 주문했다. 그렇다면, 현재 주문 가능한 상태인지 여부를 반환하시오.
# 풀이과정
해당 문제는 주문 목록 중 주문한 요리가 있으면 되는 문제로 주문을 순회하면서 메뉴에 있는지 파악해도 되지만 시간을 단추하기 위해 정렬 하여 순회하도록 하면 조금 더 빠르게 구할 수 있다고 생각했다.
shop_menus = ["만두", "떡볶이", "오뎅", "사이다", "콜라"] shop_orders = ["오뎅", "콜라", "만두", "햄버거"] def is_available_to_order(menus, orders): shop_menus.sort() # menus 정렬 shop_orders.sort() # order 정렬 checker = 0 k = -1 temp = menus for order in orders: # order 순회 temp = temp[k+1:] # 있다고 판단되는 원소는 제외하고 그 이 후부터 탐색 for i, menu in enumerate(temp): # 남은 메뉴들을 순회 함 if menu == order: # 주문목록에 있는 메뉴가 있다면 k = i # 현재 인덱스 저장 checker += 1 # 갯수 + 1 break # 탈출 if len(shop_orders) == checker: # 주문 목록과 일치했던 갯수를 비교 return True # 일치한다면 메뉴에 전부 있는 메뉴 else: return False # 일치하지 않는다면 메뉴에 없는 메뉴 result = is_available_to_order(shop_menus, shop_orders) print(result)
하지만 코드를 다 짜고 몇일 뒤에 다시 확인해보니 정렬을 하는 의미 조금만 있다고 생각이 바꼈는데.
순회를 반복하면 비교할 대상이 줄어드는 부분 정도 이다 .
원래대로라면 5 > 5 > 5 > 5 > 5 번순회해야하지만 5 > 4> 3> 2 > 1 순회하기 때문에 속도 저하는 일어났을 것이다 .
하지만 답안 코드를 보면 이거보다 더 쉽고 효율적인 방법으로 작성을 하였다.
바로 집합 함수인 기존 함수인 set 함수를 이용한 것이다.
# 모범답안 코드
shop_menus = ["만두", "떡볶이", "오뎅", "사이다", "콜라"] shop_orders = ["오뎅", "콜라", "만두"] def is_available_to_order(menus, orders): menus_set = set(menus) # 집합으로 변경 for order in orders: # 주문들을 순회하면서 if order not in menus_set: return False # 내부에 해당 집합이 없다면 False 반환 return True # 있다면 True result = is_available_to_order(shop_menus, shop_orders) print(result)
내장 함수를 이용하여 더 빠르게 구할 수 있다.
'개발일지 > 알고리즘' 카테고리의 다른 글
문제 - 올바른 괄호 (0) 2021.12.27 문제 - 쓱 최대로 할인 (0) 2021.12.27 문제 - 더하거나 빼거나 (0) 2021.12.27 문제 - 문자열 뒤집기 (0) 2021.12.27 문제 - 소수 나열하기 (0) 2021.12.27