# 메뉴 리뉴얼 (Python) - 2021 KAKAO BLIND

Anna's blog·2021년 5월 6일
0

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

[문제]
orders 배열로 주어진 주문이력을 이용해서, course 배열로 주어지는 메뉴개수 당, 가장 많이 주문된 메뉴구성을 찾기. 동률은 모두 추가하고, 또 반드시 2번 이상 주문된 메뉴여야 한다.

orders = ["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"]
course = [2,3,4]
return ["AC", "ACDE", "BCFG", "CDE"]

[제한사항]
- orders 배열의 크기는 2 이상 20 이하
- orders 배열의 각 원소는 크기가 2 이상 10 이하인 문자열
- course 배열의 크기는 1 이상 10 이하

배열의 크기가 작으므로 시간복잡도가 중요한 문제는 아니다.

[방법]
- 추가하고자 하는 메뉴의 갯수(course)의, 주문메뉴(orders) combinations 을 구하여, 모은 후, 여기서 가장 많이 주문된 메뉴 구성을 답에 추가한다.

[코드]

  • itertools.combinations 으로 메뉴 조합을 찾아 모은후, collections.Counter 를 사용하여 메뉴를 key, 메뉴개수를 value로 하는 counter객체(dict처럼 동작) 를 얻어, 가장 큰 value를 갖는 메뉴를 구한다.
from itertools import combinations
from collections import Counter


def solution(orders, course):
    answer = []
    sorted_orders = []
    for order in orders:
        sorted_orders.append(''.join(sorted(order)))

    for num in course:
        temp = []
        for order in sorted_orders:
            comb = combinations(order, num)
            candidates = list(map(lambda x: ''.join(x), comb))
            temp.extend(candidates)

        if temp:
            count_dict = Counter(temp)
            most_popular = max(count_dict.values())
            new_menu = [key for key in count_dict if count_dict[key] == most_popular and count_dict[key] >= 2]
            answer.extend(new_menu)

    answer.sort()
    return answer
  • 문제를 잘 읽고, 초기메뉴의 문자열 자체를 sort 처리 해준 후, 조합해야 하는 것에 주의해야 한다. combination 자체는 순서와 상관이 없지만, 그 결과물로 나오는 tuple의 앞뒤원소의 위치가 다르면, 이는 동일한 구성임에도 다른 값으로 인식되기 때문이다.
profile
개발 공부하는 1인

0개의 댓글