코딩관계론

[프로그래머스] 메뉴리뉴얼(python) 본문

개발/알고리즘

[프로그래머스] 메뉴리뉴얼(python)

개발자_티모 2022. 10. 9. 19:42
반응형

풀이

각 메뉴들을 조합하여 리스트에 저장하고, 각 course 개수의 best like를 구해주면 된다.

코드

from collections import Counter
from collections import defaultdict

import itertools

def solution(orders, course):
    answer = []
    cand_comb_menu = []

    for num in course:
        for order in orders:
            comb_menues = list(itertools.combinations(order, num))

            #AC, AD, AE
            for comb_menu in comb_menues:
                comb_menu = sorted(comb_menu)
                cand_comb_menu.append("".join(comb_menu))

    cand_comb_menu = Counter(cand_comb_menu).most_common()

    best_like_dict = defaultdict(int)

    for course_num in course:
        best_like = 0

        for menu, like in cand_comb_menu:
            if len(menu) == course_num:
                best_like = max(best_like, like)

        best_like_dict[course_num] = best_like

    
    for course_num in course:
        if best_like_dict[course_num] == 0 or best_like_dict[course_num] < 2:
            continue

        for menu, like in cand_comb_menu:
            if len(menu) == course_num and like == best_like_dict[course_num]:
                answer.append(menu)

    print(sorted(answer))
    return sorted(answer)

 

더 짧은 버전

from collections import Counter
from collections import defaultdict

import itertools

def solution(orders, course):
    answer = []
    cand_comb_menu = []

    for num in course:
        comb_menues = []
        
        for order in orders:
            comb_menues += list(itertools.combinations(sorted(order), num))
            
        cand_comb_menu = Counter(comb_menues)
        answer += [''.join(k) for k, v in cand_comb_menu.items() if v == max(cand_comb_menu.values()) and v>1]

    return sorted(answer)

 

 

소감

처음에는 모든 메뉴를 조합하여 완전탐색을 진행했다.

그렇게하면 n은 최대 24, r은 10이 되어 시간초과가 발생했다.

각 메뉴들마다 완전 탐색을 진행하면 n은 최대 10, r은 10이 되어 탐색의 개수가 훨씬 줄어들고,  메뉴 상에 없는 메뉴들은 조합되지 않아 검색의 시간을 줄일 수 있다.

반응형