[Programmers][Python]메뉴 리뉴얼

MEIN_FIGUR·2021년 8월 23일
0
post-custom-banner

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

📌풀이


내가 쓴 풀이(성공)

  • defaultdict를 활용해 각 course의 원소마다 딕셔너리를 생성
  • course의 원소 기준, 각 orders의 원소들을 combinations를 통해 조합을 생성하고, 문자열로 치환하여 딕셔너리의 key로 활용
  • 딕셔너리가 비어있거나, value의 최대값이 1인 경우, 메뉴를 구성할 수 없으므로 skip
  • 딕셔너리의 value의 최대값을 확인하고, 일치하는 모든 경우를 결과 리스트 answer에 추가
  • sort를 활용해 오름 차순 정렬
from itertools import combinations
from collections import defaultdict


def solution(orders, course):
    answer = []
    
    for c in course:
        # 각 요리의 개수에 따른 딕셔너리 생성
        dic = defaultdict(int)
        for order in orders:
            # order 안에서 생성될 수 있는 요리 조합을 다 저장
            for case in combinations(order, c):
                case = ''.join(sorted(list(case)))
                dic[case] += 1
        # 딕셔너리가 비어있거나, 최대값이 1인 경우는 넘김
        if not dic or max(dic.values()) == 1 :
            continue
            
        # 최대값과 일치하는 모든 경우를 결과에 저장
        cnt = max(dic.values())
        for key, value in dic.items():
            if value == cnt :
                answer.append(key)
    # 알파벳 오름차순 정렬                
    answer.sort()
    
    return answer



📌후기


과거에 작성했던 풀이를 나중에 봤는데, 다시 보니 하나도 이해가 되지 않는 풀이였다. 앞으로 코드를 짤 때는 조금 더 가독성 있게 구현하고, 주석은 필수라는 생각이 강렬하게 들었다!

다른 사람들의 풀이를 보던 중, Counter를 활용해서 문제를 푼 경우들이 다수 존재했다. Counter 는 어떻게 활용할 수 있는지 한번 찾아봐야겠다!

profile
Growing Developer
post-custom-banner

0개의 댓글