[Programmers/Python] 메뉴 리뉴얼
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요소가 가질 수 있는 조합으로 시작하려는 아이디어가 중요했던 것 같다.