행궁동 데이터 엔지니어

반응형

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

 

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

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

programmers.co.kr

Python으로 프로그래머스 '메뉴 리뉴얼' 문제를 풀어봤습니다.

 

크게 3가지 IDEA가 필요한 문제였습니다.

  • 1. 메뉴 주문 조합(Combination) 구하기
  • 2. 메뉴 주문 조합별 Count 구하기
  • 3. 조합 구하기 전에 정렬하기 ["XWY", "WXA"] → ["WXY", "AWX"]
    • 정렬하지 않으면 "XW" 와 "WX"를 다른 메뉴 조합으로 봅니다.

 

 

저는 Python 기본 라이브러리인 itertools와 collections로 조합과, 조합별 Count를 구해 문제를 풀었습니다.

Solution 코드

import itertools
import collections

def solution(orders, course):
    # course 개수별 결과를 저장할 list 
    top_course = [[]] * 11

    for course_count in course:
        tmp_combi = []

        for order in orders:
            if len(order) >= course_count:
                combi_course = itertools.combinations(list(order), course_count)
                for combi in combi_course:
                    combi = sorted(combi)
                    combi = tuple(combi)
                    tmp_combi.append(combi)
                    
        # 조합이 있는 경우에만 확인
        if tmp_combi:
            tmp_combi = collections.Counter(tmp_combi)
            max_count = max(tmp_combi.values())
            if max_count > 1:
                max_cases = []
                for key, value in tmp_combi.items():
                    if value == max_count:
                        max_case = list(key)
                        max_case.sort()
                        max_case = "".join(max_case)
                        max_cases.append(max_case)
                top_course[course_count] = max_cases

    # 리스트 풀어주기
    recommand_list = []
    for recommand in top_course:
        for x in recommand:
            recommand_list.append(x)
    # 정렬
    recommand_list.sort()

    return recommand_list

테스트 Case 코드

case_1 = ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
course_1 = [2, 3, 4]

case_2 = ["ABCDE", "AB", "CD", "ADE", "XYZ", "XYZ", "ACD"]
course_2 = [2, 3, 5]

case_3 = ["XYZ", "XWY", "WXA"]
course_3 = [2, 3, 4]

print(solution(case_1, course_1))
print(solution(case_2, course_2))
print(solution(case_3, course_3))

""" Out put
>>> ['AC', 'ACDE', 'BCFG', 'CDE']
>>> ['ACD', 'AD', 'ADE', 'CD', 'XYZ']
>>> ['WX', 'XY']
"""

 

궁금하신 사항은 댓글 남겨주세요.

 

감사합니다.

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band