본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[프로그래머스] Lv. 2 메뉴 리뉴얼

by chaemj97 2022. 6. 23.
728x90

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

 

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

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

programmers.co.kr


  • 생각
    • from collections import Counter
      • 중복된 거 갯수 세서 dictionary 형태로 만들어준다.
    • 문제를 제대로 이해하지 못해 1시간 넘게 잘못된 코드를 짬... 힘들었다. 문제가 기니깐 집중력이 많이 떨어지는 듯
      • 가장 많이 함께 주문된 단품메뉴 조합을 ABC가 메뉴 구성에 있으면 AB,BC,AC는 들어가면 안된다고 생각함...ㅜ
    • 코드 계획
      1. 각 손님이 주문한 단품메뉴 조합으로 요리 개수가 n인 코스를 만듦
      2. 중복된 거 갯수를 세서 dictionary 형태로 만들기
      3. 해당주문이 나온 적이 없거나 해당 조합을 주문한 사람이 1명 이하면 pass
      4. 3번이 아니라면 가장 많이 주문한 조합을 추가
      5. 만약 가장 많이 주문한 조합이 여러개면 다 넣기
  • 코드
from itertools import combinations
from collections import Counter

def solution(orders, course):
    # 손님의 메뉴 조합으로 만들 수 있는 모든 코스
    answer = []
    
    for n in course:
        cooks = []
        for order in orders:
            # 손님의 메뉴 조합으로 만들 수 있는 코스 중 코스 길이가 n인 코스
            cook = list(combinations(sorted(order),n))
            cooks += cook
        # 중복된거 갯수 세기
        cnt = Counter(cooks)

        # (해당 주문 조합이 나온적이 없거나, 해당 조합을 주문한 사람이 1명인 경우)가 아니라면
        if len(cnt) != 0 and max(cnt.values()) != 1: 
            for c in cnt:
                # 가장 많이 함께 주문된 단품메뉴 조합!!!
                # 가장 많이 함께 주문된 메뉴 구성이 여러 개라면, 모두 배열에 담기
                if cnt[c] == max(cnt.values()):
                    answer += ["".join(c)]
            
    return sorted(answer)
728x90
반응형

댓글