programmers.co.kr/learn/courses/30/lessons/72411

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr



Solution

import itertools

def solution(orders, course):
    result = []
    for i in course:
        menu = {}
        for order in orders:
            order = sorted(list(order))
            comb_order = list(itertools.combinations(order, i))
            for c in comb_order:
                if menu.get(c) == None:
                    menu[c] = 1
                else:
                    menu[c] += 1
        menus = sorted(menu.items(), key = lambda x:x[1], reverse=True)
        if menus:
            maxCnt = menus[0][1]
        for menu in menus:
            if menu[1] < maxCnt:
                break
            if menu[1] == maxCnt and maxCnt >= 2:
                result.append(list(menu[0]))
                
    for i in range(len(result)):
        result[i] = ''.join(result[i])
    
    result_set = set(result)
    return sorted(list(result_set))

 

코스에 들어가는 요리 개수에 맞게 orders를 검사한다. order를 하나씩 보는데 요리들이 주문된 조합들을 얻기 위해 combinations를 사용했다. 그리고 그 조합들을 menu에 담아준 후 value(주문된 횟수)를 기준으로 정렬하여 menus에 담는다. menus는 다음과 같이 나올 것이다.

 

[(('A', 'C'), 4), (('C', 'D'), 3), (('C', 'E'), 3), (('D', 'E'), 3), (('B', 'C'), 2), (('B', 'F'), 2), (('B', 'G'), 2), (('C', 'F'), 2), (('C', 'G'), 2), (('F', 'G'), 2), (('A', 'D'), 2), (('A', 'E'), 2), (('A', 'B'), 1), (('A', 'F'), 1), (('A', 'G'), 1), (('A', 'H'), 1), (('C', 'H'), 1), (('D', 'H'), 1), (('E', 'H'), 1)]
[(('C', 'D', 'E'), 3), (('B', 'C', 'F'), 2), (('B', 'C', 'G'), 2), (('B', 'F', 'G'), 2), (('C', 'F', 'G'), 2), (('A', 'C', 'D'), 2), (('A', 'C', 'E'), 2), (('A', 'D', 'E'), 2), (('A', 'B', 'C'), 1), (('A', 'B', 'F'), 1), (('A', 'B', 'G'), 1), (('A', 'C', 'F'), 1), (('A', 'C', 'G'), 1), (('A', 'F', 'G'), 1), (('A', 'C', 'H'), 1), (('A', 'D', 'H'), 1), (('A', 'E', 'H'), 1), (('C', 'D', 'H'), 1), (('C', 'E', 'H'), 1), (('D', 'E', 'H'), 1)]
[(('B', 'C', 'F', 'G'), 2), (('A', 'C', 'D', 'E'), 2), (('A', 'B', 'C', 'F'), 1), (('A', 'B', 'C', 'G'), 1), (('A', 'B', 'F', 'G'), 1), (('A', 'C', 'F', 'G'), 1), (('A', 'C', 'D', 'H'), 1), (('A', 'C', 'E', 'H'), 1), (('A', 'D', 'E', 'H'), 1), (('C', 'D', 'E', 'H'), 1)]

 

첫 번째 원소가 가장 많이 주문된 요리 조합이므로, maxCnt에 첫 번째 원소의 주문 횟수를 담아주고 다른 원소들을 검사하며 주문 횟수가 적어지면 바로 for문을 탈출한다.

 

 


생강강

,