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 을 구하여, 모은 후, 여기서 가장 많이 주문된 메뉴 구성을 답에 추가한다.
[코드]
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의 앞뒤원소의 위치가 다르면, 이는 동일한 구성임에도 다른 값으로 인식되기 때문이다.