프로그래머스 - 메뉴 리뉴얼

weenybeenymini·2021년 9월 11일
0

문제

손님들이 많이 시킨 메뉴 조합을 알아내는 문제

생각

문제를 이해하기가 너무 어려웠음

시킨 횟수가 똑같을 때 오름차순으로 정렬해야하고,
최소 2명 이상이 시킨 조합이여야하며,
입력으로 들어오는 코스 배열의 수 만큼의 조합을 얻어야 한다는 점을
쭈욱 읽고 이해할 수 없었다.. 나는

(왜 4일 땐 저렇게 두 개가 result에 있고, 그럼 왜 2 일 땐 c, d 는 없지?)

나만 이렇게 문제를 이해못하는건지 질문하기에도 질문을 올린 사람은 없고
그냥 구글링해서 코드보고 문제를 이해했다

코드도 뭔가 느낌이 다양하던데, 문자열 처리 문제기도하고, 간단하게 이해하고 싶어서
파이썬 코드 중에 제일 이해하기 쉬웠던 코드를 참고했다

코드

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    
    for c in course:
        order_dict = {} //조합 스트링을 key로, 등장 횟수를 value로 저장
        order_combinations = [] //course의 수에 따라 combination 만들어서 저장
        
        for o in orders:
            combi = combinations(sorted(o), c) //정렬한 주문기록에서 c 만큼의 수 조합 꺼냄
            order_combinations += list(combi) //리스트로 바꿔서 저장해놓고
            
        for oc in order_combinations: //리스트 돌면서
            order_str = ''.join(oc) //리스트를 공백없이 붙인 str을
            if order_str in order_dict: //딕셔너리에 있으면 +1하고
                order_dict[order_str] += 1
            else: //없으면 추가해준다
                order_dict[order_str] = 1 
        
        for od in order_dict: //딕셔너리 키 돌면서
            //딕셔너리 값들 중 가장 큰 값이랑 값이 같은 키를 찾으면
            if order_dict[od] == max([order_dict[order] for order in order_dict]):
                    if order_dict[od] > 1: //그런데 value값이 2이상이여야하니까~
                        answer.append(od) //키를 붙여줌
    
    return sorted(answer)

0개의 댓글