프로그래머스 메뉴 리뉴얼을 파이썬으로 풀어보겠다.
이번 문제의 난이도는 레벨 2고 2021년 카카오 문제다.
비교적 최근 문제라 개인적으로 약간 까다로웠다.
문제
가장 많이 주문된 메뉴들을 찾아 세트의 메뉴 개수에 맞게 코스 메뉴로 구성하는 문제이다.
구현
combinations 밖에 생각나지 않았다.
우선 combinations를 써서 각 order의 조합을 모두 구한 후
string으로 합쳐서 dict를 만들었다.
그리고 dict의 value가 가장 높은 값을 찾아서 answer에 더해줬다.
마지막으로 사전순 정렬을 위해 sort 해서 정답을 리턴했다.
코드
from itertools import combinations
def solution(orders, course):
answer = []
for c in course:
cnt = {}
comb = []
for o in orders:
comb.extend(list(combinations(sorted(o), c)))
for c in comb:
order = ''.join(c)
if order in cnt:
cnt[order] += 1
else:
cnt[order] = 1
for c in cnt:
if cnt[c] == max([cnt[c] for c in cnt]):
if cnt[c] > 1:
answer.append(c)
return sorted(answer)
맨 처음에 course에서 가져온 값으로 조합을 뽑아서 모두 더해줬다.
그 후 뽑은 조합을 모두 연결했다. ( 만약 ['A', 'C'], ['A', 'D']를 뽑았다면 'AC', 'AD'로 변환)
그 후 해당 값이 몇 개 있는지 dict에 넣어서 count 되도록 했다.
dict의 value가 제일 큰 것을 answer에 append 해주었다.
다른 풀이
import collections
import itertools
def solution(orders, course):
result = []
for course_size in course:
order_combinations = []
for order in orders:
order_combinations += itertools.combinations(sorted(order), course_size)
most_ordered = collections.Counter(order_combinations).most_common()
result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]
return [ ''.join(v) for v in sorted(result) ]
사기급 풀이를 가져왔다.
성능도 비교할 수 없이 좋다.
뽑는 로직까지는 똑같으나
counter를 사용해 메뉴 조합의 수를 세고,
most_common() method로 많이 주문된 메뉴 조합이 앞으로 오도록 했다.
그리고 result에 max값 ( most_ordered [0][1] )과 같은 value를 가진 것들을 정답에 추가했다.
그러면 ('A','C')와 같은 튜플들이 들어가는데 이것을 붙이도록
리턴할 때 join을 해서 'AC'가 되도록 만들어주었다.
Counter는 여러 군데서 많이 쓸 수 있을 것 같다.
아래에 docs를 첨부해놓겠다.
https://docs.python.org/3/library/collections.html#collections.Counter
'Coding Test > Python' 카테고리의 다른 글
[프로그래머스] 숫자의 표현 Python Code (0) | 2022.09.08 |
---|---|
[프로그래머스] 괄호 변환 Python Code (0) | 2022.09.04 |
[프로그래머스] 튜플 Python Code (0) | 2022.09.01 |
[프로그래머스] 행렬 테두리 회전하기 Python Code (2) | 2022.09.01 |
[프로그래머스] 짝지어 제거하기 Python Code (0) | 2022.08.31 |
댓글