👨‍🏫ps/❄️프로그래머스

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

peacekim 2023. 3. 25. 17:46
반응형

문제

구현 문제이다.

처음에 모든 조합을 combination을 구현하여, 모든 조합을 구했다,,!!(itertools에 combination이 있다,,,)

dictionary를 사용하여, 각 조합의 갯수를 구했다.(이것도 collections의 Counter를 사용하면 되긴하다.)

이후에 dq를 사용하여, 동일한 길이의 조합 중에 가장 많은 갯수의 조합을 왼쪽에 놓았다.

dq의 앞에가 가장 큰 값이기 때문에 그 값과 비교하여, 같은 조합만 answer에 넣어주고 작은 값이 나오면 break해주었다.

answer의 값들을 sort해주어서 return 했다.

코드

from collections import deque
def solution(orders, course):
    answer = []
    combi = []
    for o in orders:
        for c in course:
            combi += combination("",sorted(o), c)
    # 각 조합의 갯수 저장
    dic = {}
    for co in combi:
        if co in dic:
            dic[co] += 1
        else:
            dic[co] = 1
    dqList = [deque([]) for i in range(course[-1] + 1)]
    # 동일한 길이의 가진 문자열 중 가장 많은 조합의 갯수를 queue 왼쪽에 저장.
    for k,v in dic.items():
        
        if len(dqList[len(k)]) == 0:
            dqList[len(k)].append([v,k])
        else:
            if dqList[len(k)][0][0] <= v:
                dqList[len(k)].appendleft([v,k])
    
    # 동일한 길이의 가진 문자열 중 가장 많은 조합의 갯수들을 찾아 answer에 저장
    for dq in dqList:
        if len(dq) == 0:
            continue
        maxNum = dq[0][0]
        # 가장 큰 값이 2보다 작으면 코스요리에 넣지 않는다.
        if maxNum < 2:
            continue
        answer.append(dq[0][1])
        dq.popleft()
        while len(dq) > 0:
            if maxNum == dq[0][0]:
                answer.append(dq[0][1])
                dq.popleft()
            else:
                break
    # 알파벳 순으로 sort
    answer.sort()
    return answer

def combination(tmp,o, c):
    ls = []
    if len(tmp) == c:
        return [tmp]
    for i in range(len(o)):
        tmp += o[i]
        ls += combination(tmp, o[i+1:], c)
        tmp = tmp[:-1]

    return ls
"""
코스 요리
주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성
코스요리 메뉴 = 최소 2가지 이상의 단품메뉴 and 최소 2명 이상의 손님한테 제공
새로 추가하게 될 코스요리의 메뉴 구성을 문자열 return
course에 나온 갯수대로 배열을 만들고, 조합들을 만들기.
조합
"""
반응형