from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for c in course :
com = []
for order in orders :
com.extend(combinations(sorted(order), c))
com = Counter(com).most_common()
com = list(map(lambda x : x[0], filter(lambda x : x[1]==com[0][1] and x[1]!= 1, com)))
if com :
answer.extend(com)
return sorted(map(lambda x: ''.join(x),answer))
풀이
1. combinations함수를 이용해 손님들이 주문한 단품메뉴들(orders)로 코스요리 메뉴 구성 수(c)에 따라 조합을 구한다.
- ★ sorted 해주는 이유 : "WX" 와 "XW"는 같으므로 이를 위해 문자열 정렬해준다.
2. Counter 클래스의 most_common 메서드를 이용하여 데이터의 개수가 많은 순으로 정렬된 배열을 리턴한다.
- 예) 테스트 1번의 c = 2라고 한다면 most_common 메서드를 이용하면 아래 처럼 반환된다.
- [(('A', 'C'), 4), (('C', 'D'), 3), (('C', 'E'), 3), (('D', 'E'), 3), (('B', 'C'), 2), (('B', 'F'), 2), (('B', 'G'), 2), (('C', 'F'), 2), (('C', 'G'), 2), (('F', 'G'), 2), (('A', 'D'), 2), (('A', 'E'), 2), (('A', 'B'), 1), (('A', 'F'), 1), (('A', 'G'), 1), (('A', 'H'), 1), (('C', 'H'), 1), (('D', 'H'), 1), (('E', 'H'), 1)]
3. 조합의 빈도수가 가장 많은 코스 (com의 맨 앞 빈도수와 같은 것) 하지만 그 빈도수가 1 이상인 조합(최소 2명 이상의 손님으로부터 주문된 단품 메뉴 조합에 대해서만 고려한다고 했기때문)들을 반환한다. (빈도수가 1이면 빈 리스트가 된다)
- [('A', 'C')]
4. com이 빈 리스트가 아니라면 정답에 넣어준다.
5. map과 lambda를 이용하여 튜플에 있는 메뉴들을 각 배열에 담아, 오름차순으로 정렬한다.
'Algorithm > Programmers' 카테고리의 다른 글
[Python] 다리를 지나는 트럭 (0) | 2021.06.04 |
---|---|
[Python] 위장 (0) | 2021.06.02 |
[Python] 뉴스 클러스터링 (0) | 2021.05.28 |
[Python] 소수 찾기 (0) | 2021.05.27 |
[Python] 전화번호 목록 (0) | 2021.05.27 |