티스토리 뷰

728x90

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

 

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

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

programmers.co.kr

프로그래머스에 오랜만에 새로운 문제가 업데이트됬다.

 

- 접근법

 

주어지는 배열의 크기만 봐도 짐작이 가듯이 브루트포스로 간단히 풀리는 문제이다.

손님들이 주문한 코스 메뉴들의 2개이상 모두 조합하여 자료구조에 저장하고 카운팅한다.

그렇게 저장된 자료구조에서 다시 저장된 코스들의 길이(=course배열), 그리고 카운팅된 숫자(>=2)를 뽑아, 각 코스들의 길이에서 카운팅된 숫자의 최댓값에 해당되는 부분만 뽑아 사전순으로 출력하면 된다.

 

ps) 파이썬에선 combinations 함수를 쓰면 더욱 간단하게 코드를 작성할 수 있습니다


- 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from collections import defaultdict
course_menu=defaultdict(int)
course_count=defaultdict(int)
def combine_menu(order_menu,vertex,menu) :
    if vertex==len(order_menu) :
        if len(menu)>=2 :
            temp=list(menu)
            temp.sort()
            course_menu[''.join(temp)]+=1
        return
    combine_menu(order_menu,vertex+1,menu+order_menu[vertex])
    combine_menu(order_menu,vertex+1,menu)
    
def solution(orders, course):
    answer = []
    for order in orders :  
        combine_menu(order,0,"")
    survey_menu=sorted(course_menu.items(),key=lambda x:len(x[0]),reverse=True)
    for x in survey_menu :
        menu_name, menu_count=x
        if len(menu_name) in course and menu_count>=2 :
            if course_count[len(menu_name)]<menu_count :
                course_count[len(menu_name)]=menu_count
    for x in course_count.items() :
        list_len, list_count=x
        for items in survey_menu :
            menu_name, menu_count=items
            if list_len==len(menu_name) and list_count==menu_count :
                answer.append(menu_name)
    answer.sort()
    return answer
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함