코테연습문제

[Programmers/Python] 메뉴 리뉴얼

SI-AH 2023. 4. 17. 13:55

import itertools

def solution(orders, course):
    answer = []
    
    # 풀이과정 1
    for course in course:
        menuComb = []
        menuDict = {}
        for order in orders:
            menuComb.extend(list(itertools.combinations(sorted(order), course))) # 유의했던 사항 2
    
    	# 풀이과정 2
        for comb in menuComb:
            combs = ''.join(comb)
            if combs in menuDict:
                menuDict[combs] += 1
            else:
                menuDict[combs] = 1

    	# 풀이과정 3
        for key in menuDict:
            # 유의했던 사항 3
            if menuDict[key] == max(menuDict.values()) and menuDict[key] > 1:
                answer.append(key)
                
    answer.sort() # 유의했던 사항 1
    return answer

유의했던 사항

1. 정답은 오름차순 정렬해서 return → 마지막에 sort해줌

2. 조합 사용 → itertools를 import 해서 combinations 사용

3. 최소 2명 이상의 손님으로부터 주문된 단품 메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함

    → dictionary에서 value가 2 이상이어야 정답에 포함

 

풀이과정

★1. 각 orders에서 나올 수 있는 조합을 구한다. (combinations 사용하는데, course로 몇개씩 조합할지)

     → for문을 통해 차례로 모든 orders 요소에 대해 진행

2. 그 조합들을 담는 dictionary를 만드는데, 다른 orders 요소가 갖는 조합 중 겹치는 조합이 있다면 찾아서 value + 1

3. value중에서 가장 큰 값을 갖는 key를 answser에 append → 각 value가 무조건 2 이상(2인 이상 선택해야함)

 

알게된 것

extend vs. append

append는 리스트 끝에 원소를 추가

extend는 리스트 끝에 가장 바깥쪽 iterable의 모든 항목을 추가

    → 그래서 + 랑 비슷한 결과가 나오는데,

        차이점은 +는 원소가 추가된 새로운 리스트가 반환 되고, extend는 기존 리스트가 업데이트 되는 것

lst = ['a', 'b', 'c', 'd']
appendLst = [['e', 'f']]
extendLst = [['g', 'h']]

#append 사용
lst.append(appendLst)
print(lst) # 결과: ['a', 'b', 'c', 'd', ['e', 'f']]


#extend 사용
lst = ['a', 'b', 'c', 'd']
lst.extend(extendLst)
print(lst) # 결과: ['a', 'b', 'c', 'd', 'e', 'f']

 

 

 


 

-) 전체 메뉴로 조합을 한 번에 구해서 비교하려고 해서 시간이 오래 걸렸다.

 

+) 조합을 활용하고, 딕셔너리를 사용해서 개수를 비교하는 아이디어를 바로 생각해냈다.

 

 

처음 생각했던 풀이법은

1. 전체 메뉴를 담는 set()을 만듦

2. course에 맞는 개수만큼 combinations를 list에 저장

3. 그 list를 돌면서 dictionary에 {메뉴: 개수} 담음

4. 개수가 max인 key를 answer에 append

 

였는데, 3번을 구현하기 어려웠다.(각 order의 요소를 각각의 string으로 나눠서 비교하고 이래야 해서)

그냥 각각의 orders요소가 가질 수 있는 조합으로 시작하려는 아이디어가 중요했던 것 같다.