[PRO] 메뉴 리뉴얼

천호영·2022년 7월 10일
0

알고리즘

목록 보기
34/100
post-thumbnail

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

from itertools import combinations
from collections import defaultdict

def solution(orders, course):
    answer = []
    
    for pick_num in course: # pick_num: 몇 개로 코스요리를 구성할지
        default_dict = defaultdict(int)
        for order in orders:
            for alphas in combinations(order, pick_num):
                default_dict[''.join(sorted(alphas))] += 1
                
        if default_dict: # max()에 empty 전달 방지용
            max_count = max(default_dict.values())
            for k, v in default_dict.items():
                if v == max_count and max_count >= 2:
                    answer.append(k)    
        
    return sorted(answer)

위 코드를 좀 더 pythonic하게 바꾸면 다음과 같다. max()를 체크하는 조건을 list comprehension 안에 넣으면 max()에 empty값이 전달될 여지를 없앨 수 있다.
다만, 이러면 매번 max값을 구해서 시간측면에서 비효율적이다.

from itertools import combinations
from collections import defaultdict

def solution(orders, course):
    answer = []
    
    for pick_num in course:
        default_dict = defaultdict(int)
        for order in orders:
            for alphas in combinations(order, pick_num):
                default_dict[''.join(sorted(alphas))] += 1

        answer += [k for k,v in default_dict.items() if v>=2 and v == max(default_dict.values())]
        
    return sorted(answer)

collections.defaultdict를 안쓰고 collections.Counter를 쓰는 방법도 있다. 두 방법 모두 갯수를 세는 방법이다.

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    
    for pick_num in course:
        num_combs = []
        for order in orders:
            for alphas in combinations(order, pick_num):
                num_combs.append(''.join(sorted(alphas)))
        
        counter_most_common = Counter(num_combs).most_common()
        answer += [k for k,v in counter_most_common if v>=2 and v==counter_most_common[0][1]]
        
    return sorted(answer)
profile
성장!

0개의 댓글