1from itertools import combinations
2from collections import defaultdict
3
4def solution(orders, course):
5 answer = []
6
7 for i in course:
8 dataset = defaultdict(int)
9
10 for j in orders:
11 for k in combinations(j, i):
12 # ABC, ACB를 같은 것으로 취급하기 위해 정렬
13 dataset[''.join(sorted(k))] += 1
14
15 if len(dataset) == 0:
16 continue
17
18 max_value = max(dataset.values())
19
20 # 2번 이상 주문된 메뉴만 추가
21 if max_value == 1:
22 continue
23
24 for k, _ in filter(lambda x:x[1] == max_value, dataset.items()):
25 answer.append(''.join(k))
26
27 return sorted(answer)
문제
- 손님들이 주문한 단품메뉴들이 문자열 형식으로 담긴 배열 orders, 코스 요리를 구성하는 단품메뉴들의 갯수가 담긴 배열 course가 주어진다
- 손님들이 함께 주문한 단품메뉴들 중, 가장 많이 함께 주문한 단품메뉴 조합을 코스요리 메뉴로 구성하려고 한다
- 코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성되어야하며, 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합만을 코스요리 메뉴 후보에 포함한다
- 코스요리 메뉴의 구성을 문자열 형식으로 배열에 담아 사전순으로 오름차순 정렬하여 return하라
- TC
- input
orders: [“ABCFG”, “AC”, “CDE”, “ACDE”, “BCFG”, “ACDEH”]
course: [2,3,4] - ouput
[“AC”, “ACDE”, “BCFG”, “CDE”]
- input
해결방법
- combinations를 사용하여 모든 조합을 구해서 defaultdict로 개수를 센다
- defaultdict의 value 중 최대값을 구하고, 최대값과 같은 value를 가진 key를 answer에 추가한다