프로그래머스 메뉴 리뉴얼 코드 및 해설 (파이썬)

2021. 6. 1. 15:26algorithm

반응형

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

 

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

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

programmers.co.kr

 

combinations를 사용해 모든 메뉴 조합을 구하고, 이를 combs에 저장합니다. 이후 이 combs를 메뉴 개수가 많은 순대로 정렬하고, 개수가 같다면 빈도 수가 높은 순대로 정렬합니다. 각 길이 별로 가장 빈도수가 높은 메뉴 조합을 answer에 append하고, 최종적으로 answer를 알파벳 순으로 정렬한 후 반환합니다.

 

from itertools import combinations 
from collections import Counter

def solution(orders, course):
    answer = []
    combs = []
    
    for order in orders:
        for c in course:
            # (A,B)와 (B,A)가 따로 만들어지지 않도록 order를 알파벳 정렬 
            order = list(order)
            order.sort()
            combs += list(combinations(order, c))
    
    # 길이 긴 순으로 정렬, 같은 길이라면 빈도가 높은 순대로 정렬 
    combs = sorted(Counter(combs).items(), reverse=True, key=lambda x: (len(x[0]), x[1]))
    
    prev_len = 0
    max_count = 0
    for comb in combs:
        menu, count = comb
        # 주문 횟수가 2보다 작은 경우, 각 길이의 가장 많이 함께 주문된 메뉴 구성이 아닌 경우
        if count < 2 or (count < max_count and len(menu) == prev_len): 
            continue
        answer.append(''.join(menu))
        max_count = count
        prev_len = len(menu)
    
    # 최종 답을 알파벳 순으로 정렬
    answer.sort()
    
    return answer
반응형