-
[Python] programmers 메뉴 리뉴얼 - 구현 문제알고리즘/문제풀이 2021. 7. 3. 19:26728x90
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 모듈를 사용하여 더 간결하게 구현할 수 있다.
반응형'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] 스타트 링크 5014 - bfs 그래프 탐색 (0) 2021.07.03 [Python] 백준 한 줄로 서기 1138 - 구현 문제 (0) 2021.07.03 이진탐색(Binary Search) with Python (0) 2021.01.22 해시 알고리즘 (0) 2020.09.20 python 해시 테이블 (0) 2020.09.20