Algorithm/Python

[Python] 프로그래머스 - 메뉴 리뉴얼(재귀)

힘팽 2022. 3. 20. 22:01

◈ 오류 정정 및 피드백 환영

 

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

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

programmers.co.kr


🔎문제 분석

조합(combination)만 구현하면 풀 수 있는 간단한 문제이다. 


def combinations_scratch(l):
    if l:
        result = combinations_scratch(l[:-1])
        return result + [c + [l[-1]] for c in result]
    else:
        return [[]]
    
def solution(orders, course):
    result = []
    for n in course:
        menu = []
        for order in orders:
            menu += [''.join(sorted(x)) for x in combinations_scratch(order) if len(x)==n]
        menu_dict = {x: menu.count(x) for x in menu}
        if menu_dict:
            best_menu = max(menu_dict.values()) 
            result += [k for k, v in menu_dict.items() if v==best_menu& best_menu>1]
    return sorted(result)


👀다른 풀이

사실 굳이 구현할 필요는 없다. itertools를 사용하자. 

그리고 이번에는 Counter도 사용해서 시간을 더 단축해보자.


from itertools import combinations 
from collections import Counter

def solution(orders, course):
    result = []
    for n in course:
        menu = []
        for order in orders:
            menu += list(map(lambda x: ''.join(x), combinations(sorted(order), n)))
        menu_dict = Counter(menu)
        if menu_dict:
            best_menu = max(menu_dict.values()) 
            result += [k for k, v in menu_dict.items() if v==best_menu& best_menu>1]
    return sorted(result)