Algorithm/Programmers

[Python] 메뉴 리뉴얼

느낌표 공장장 2021. 6. 2. 15:15
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