동캄의 코딩도장

프로그래머스 level2 [메뉴 리뉴얼] 파이썬 본문

코테/프로그래머스

프로그래머스 level2 [메뉴 리뉴얼] 파이썬

동 캄 2021. 12. 23. 20:01

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

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

#프로그래머스 메뉴 리뉴얼 시간초과

def solution(orders, course):
    import itertools
    answer = []
    s=''
    for order in orders:
        s+=order
    s=set(s)
    for i in range(len(course)):
        combi=itertools.combinations(s,course[i])
        M=2
        m=[]
        for c in combi:
            cnt=0
            for order in orders:
                if len(order)>=course[i]:
                    for menu in c:
                        if menu not in order:
                            break
                    else:
                        cnt+=1
            if cnt>M: 
                m=[]
                c=list(c)
                c.sort()
                m.append(''.join(c))
                M=cnt
            elif cnt==M:
                c=list(c)
                c.sort()
                m.append(''.join(c))
        for men in m:
            answer.append(men) 
    answer.sort()
    return answer

맨처음에는 각 order에 사용된 메뉴를 모두 조합해서 조합(combination)을 시도하려고 했으나, 시간초과가 발생하였다.

이것저것 다른 방법을 시도해보다 다른분의 풀이를 보고 풀었다. ㅠㅠ

 

from itertools import combinations
from collections import Counter


def solution(orders, course):
    answer = []
    for c in course:
        temp = []
        for order in orders:
            combi = combinations(sorted(order), c)
            temp += combi
        counter = Counter(temp)
        if len(counter) != 0 and max(counter.values()) != 1:
            answer += [''.join(f) for f in counter if counter[f] == max(counter.values())]
    return sorted(answer)

각각의 course에 대해 combination을 진행한다. 또한, 이 조합들을 더한뒤, Counter 함수를 이용하여 정리한다.

이러한 방법을 이용함으로써, 앞 방법보다 시간 효율성이 훨씬 좋아지게되었다.