[프로그래머스] 메뉴 리뉴얼 문제분석 python

mauz·2022년 6월 19일
0

🐒 문제

https://programmers.co.kr/learn/courses/30/lessons/72411

✍ 나의 풀이

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    for i in course:
        freq = []
        for order in orders:
            for tmp in combinations(order, i):
                freq.append(''.join(sorted(tmp)))
        
        mostcnt = Counter(freq).most_common()
        answer += [menu for menu, cnt in mostcnt if cnt > 1 and cnt == mostcnt[0][1]]
    return sorted(answer)

못풀겠어서 검색을 했다.


🧠 문제 이해

처음 문제를 보고
그냥 전체 주문 중에서 가장 많이 등장한 알파벳을 course리스트의 요소만큼 리스트에 담아내는 건줄 알았는데,

코스요리로 함께 내야하므로 각 손님이 주문한 요리의 조합 중에서 가장 많이 등장한 조합을 뽑아야한다.


코드

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    for i in course:
        freq = []
        for order in orders:
            for tmp in combinations(order, i):	# order에서 i개 만큼 순서없이 튜플형태로 뽑아내기 ('A','B','C'...)
                freq.append(''.join(sorted(tmp)))	# sorted()로 tmp를 정렬된 리스트로 리턴받고 join으로 문자열로 만들어줌
        
        mostcnt = Counter(freq).most_common()	
        	# Counter()을 통해 요리 조합이 몇번 등장하는지 알 수 있음
        		# .most_common() 메소드로 최빈조합부터 순서대로 정렬된 리스트를 받을 수 있음
                
        answer += [menu for menu, cnt in mostcnt if cnt > 1 and cnt == mostcnt[0][1]]
        	# 요리조합이 두번 이상 등장하고, 최빈조합이라면 answer 리스트에 더해줌
    return sorted(answer)	# 사전순 정렬

후기

요리의 조합이 같아야한다고 까지는 이해했지만

각 손님들과 비교를 위해서 콤비네이션을 써야겠다는 생각을 못했다.

나중에 다시 풀어봐야할듯

profile
쥐구멍에 볕드는 날

0개의 댓글