알고리즘/문제풀이
[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 모듈를 사용하여 더 간결하게 구현할 수 있다.
반응형