본문 바로가기
ALGORITHM/PROGRAMMERS

[PG/Python] 메뉴 리뉴얼

by 안녕나는현서 2022. 6. 24.
728x90

📌 문제

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

 

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

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

programmers.co.kr

 

📌 문제 접근 방법

  1. orders를 문자열의 길이로 내림차순 정렬, course를 오름차순 정렬한다.
    (코스에 들어갈 메뉴의 개수보다 order의 길이가 작으면 필요없기 때문에 pop을 하기 위해 사전 처리)
  2. course를 순회하며 코스에 들어갈 메뉴 개수를 정하고 원하는 개수보다 적은 개수의 메뉴를 주문한 경우는 제외하기 위해 pop해준다.
  3. 각 주문에 대해 combination을 사용해서 만들 수 있는 조합들의 개수를 모두 센다.
  4. 조합들 중 카운팅 개수가 가장 큰 것들을 answer에 append 한다.
  5. answer를 정렬하여 반환한다.

 

📌 코드

# 프로그래머스 메뉴 리뉴얼

from collections import defaultdict
from itertools import combinations

def solution(orders, course):
    orders.sort(key=lambda x: -len(x))
    course.sort()

    answer = []
    for cnt in course:
        while orders and len(orders[-1]) < cnt:
            orders.pop()
        
        menus = defaultdict(int)
        for order in orders:
            for combo in combinations(order, cnt):
                combo = sorted(list(combo))
                menus[''.join(combo)] += 1

        result = sorted(menus.items(), key=lambda x: -x[1])
        
        i = 0
        while i < len(result) and result[0][1] >= 2 and result[i][1] == result[0][1]:
            answer.append(result[i][0])
            i += 1
    
    return sorted(answer)
728x90

'ALGORITHM > PROGRAMMERS' 카테고리의 다른 글

[PG/Python] 숫자의 표현  (1) 2022.10.03
[PG/Python] 광고 삽입  (0) 2022.06.24
[PG/Python] 캐시  (0) 2022.03.03
[PG/Python] N-Queen  (0) 2022.02.27
[PG/Python] 삼각 달팽이  (0) 2022.02.27

댓글