Algorithm/BruteForce

[프로그래머스] 메뉴 리뉴얼 (Python 파이썬)

안드선생 2021. 4. 24. 03:09
반응형

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

 

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

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

programmers.co.kr

문제 설명

문제에 대한 설명이 굉장히 길어 링크로 대체합니다.

주어진 orders중에 course 개수 만큼 코스요리로 재구성할 수 있는 메뉴들을 알파벳 오름차순으로 골라내면 됩니다.


풀이 과정

풀이 ①

딕셔너리를 이용하여, 메뉴를 구성할 수 있는 모든 경우의 수를 정리합니다.

각각의 경우에 대해 개수를 세어준 후에,

해당 케이스의 주문 횟수가 2회 이상이면서, 최댓값인 경우에 answer에 추가 합니다.

(문제에서, 각 course에 대해 가장 많이 주문된 것을 고르라고 했으므로. 단, 최댓값을 가지는 메뉴가 여러개일 경우 모두 나타내야 함)

 

마지막에 알파벳 순으로 정렬하여 나타내면 코드 완성입니다.

from itertools import combinations


def solution(orders, course):
    answer = []
    order_dict = {}

    for i in range(len(course)):
        for j in range(len(orders)):
            for c in combinations(orders[j], course[i]):
                cc = list(c)
                cc.sort()
                tmp = ''.join(cc)
                if tmp in order_dict:
                    order_dict[tmp] += 1
                else:
                    order_dict[tmp] = 1

    print(order_dict)
    for c in course:
        arr = []
        maxNum = 2
        for k, v in order_dict.items():
            if len(k) == c:
                if maxNum < v:
                    arr = [k]
                    maxNum = v
                elif maxNum == v:
                    arr.append(k)
        for i in range(len(arr)):
            answer.append(arr[i])

    answer.sort()

    return answer

print(solution(["XYZ", "XWY", "WXA"], [2,3,4]))

 

풀이 ②

파이썬의 내장모듈인 Counter를 이용합니다.

orders에 있는 모든 경우의 수를 order_list에 넣은 후에,

Counter를 통해 order_list의 각각 값들이 등장하는 횟수를 셉니다.

most_common() 메소드를 통해 빈도순으로 내림차순 정렬합니다.

 

그럼 order_list의 첫 번째 원소 order_list[0]의 두 번째 값 order_list[0][1]은 최대 횟수를 나타냅니다.

풀이 ①과 마찬가지로 주문 횟수가 2회 이상이면서, 최댓값인 경우에 answer에 추가 합니다.

from itertools import combinations
from collections import Counter


def solution(orders, course):
    answer = []
    for i in range(len(course)):
        order_list = []
        for j in range(len(orders)):
            for comb in combinations(sorted(orders[j]), course[i]):
                order_list.append("".join(comb))

        if order_list:
            order_list = Counter(order_list).most_common()
            maxCnt = order_list[0][1]

            for order in order_list:
                if order[1] == maxCnt and order[1] > 1:
                    answer.append(order[0])
                else:
                    break

        answer.sort()
    return answer

 

https://github.com/HongEunho

전체 문제 & 코드는 위의 깃에 정리되어 있습니다.

팔로우 & 맞팔은 환영입니다 !

반응형