알고리즘/문제풀이

[Python] programmers 메뉴 리뉴얼 - 구현 문제

정찡이 2021. 7. 3. 19:26
728x90

1. 문제 링크 

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

 

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

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

programmers.co.kr

 

2. 문제 요약

  • 주문할 때 가장 많이 주문한 단품 메뉴로 구성
  • 최소 2명 이상의 손님이 주문

 

3. 아이디어 정리

defaultdict에 조합 메뉴 횟수를 담아 가장 많이 주문된 요리를 찾는 풀이 하였다. 

 

 

4. 문제 풀이

4-1. 내 풀이

from itertools import combinations
from collections import defaultdict


def solution(orders, course):
    """
    2명 이상 손님에게 주문된 가장 많이 함께 주문한 단품메뉴
    :param orders: 손님이 주문한 단품메뉴들
    :param course: 코스요리를 구성하는 단품메뉴 갯수
    :return:  코스요리 메뉴 - 오름차순
    """
    answer = []
    # 1. 원하는 단품메뉴 갯수 별 조합을 생성
    for c in course:
        order_dict = defaultdict(int)
        for order in orders:
            # 2. 해당 조합 개수를 센다
            for com in combinations(sorted(order), c):
                order_dict["".join(com)] += 1
        # 3. 가장 많이 주문된 메뉴을 확인하기 위해 정렬
        if order_dict:
            order_dict = sorted(order_dict.items(), key=lambda x: x[1], reverse=True)
            max_ = order_dict[0][1]
            # 예외처리 - 가장 많이 주문된 메뉴가 여러개인 경우 넣기
            for order in order_dict:
                if order[1] == max_ and order[1] >= 2:
                    answer.append(order[0])
                else:
                    break
    # 4. 정렬해서 리턴
    return sorted(answer)

 

4-2. 다른 사람 문제 풀이

  • 내 풀이와 비슷하지만 다른 점은 Counter를 사용해서 호출된 횟수를 자동으로 셀 수 있도록 하여 간결하다. → 나의 코드에서는 dict 변수로 직접 횟수를 셌다.
  • 리스트 컴프리헨션를 사용하여 for문을 한 줄로 바꿔 간결하다.
from itertools import combinations
from collections import Counter


def solution(orders, course):
    answer = []
    for c in course:
        temp = []
        for order in orders:
            combi = combinations(sorted(order), c)
            temp += combi
        counter = Counter(temp)
        if len(counter) != 0 and max(counter.values()) >= 2:
            answer += [''.join(f) for f in counter if counter[f] == max(counter.values())]

    return sorted(answer)

 

5. 결론

  • 단순 구현 문제로 문제를 잘 읽으면 풀 수 있는 문제이다. 문제를 꼼꼼하게 읽어 예외 처리할 부분을 찾는 것이 중요할 듯하다.
  • 횟수를 셀 경우 Counter 모듈를 사용하여 더 간결하게 구현할 수 있다.

 

반응형