Agorithm/프로그래머스
프로그래머스 Level 2 메뉴 리뉴얼
kimjinho1
2022. 6. 22. 00:12
728x90
반응형
문제 상황에 맞는 적절한 자료구조를 생성하고 활용해야 되는 문제다.
Collections의 Counter를 사용하면 상당히 쉽게 풀 수 있다. 처음에 안 쓰고 풀어서 그런지 쉽지 않았다.
조합을 직접 구하기는 번거롭기에 itertools의 combinations 함수를 사용했다.
풀이 1 (Counter 사용 X)
*cource의 개수 만큼 반복([2, 3]의 경우 -> 2개짜리 조합, 3개짜리 조합 찾기)
1. 모든 order에서 가능한 n(cource 값)개 짜리 조합을 comb_li에 저장
2. comb_li에서 {주문된 개수: [메뉴1, ...], ... }의 형태의 딕셔너리 d를 생성
3. d에서 주문된 개수가 제일 많은 메뉴들을 ans에 추가
from collections import defaultdict
from itertools import combinations
def solution(orders, course):
ans = []
for n in course:
d = defaultdict(list)
comb_li = []
max_cnt = 0
for order in orders:
if len(order) >= n:
comb_li.extend(list(combinations(sorted(order), n)))
for comb in set(comb_li):
cnt = comb_li.count(comb)
d[cnt].append(''.join(comb))
if cnt > max_cnt:
max_cnt = cnt
if max_cnt > 1:
ans.extend(d[max_cnt])
return sorted(ans)
풀이 2 (Counter 사용 O)
Counter를 사용했기에 d 딕셔러니가 필요가 없다. d 딕셔너리를 생성하는데 필요했던 자잘한 코드들을 지우니 훨씬
코드가 간결해졌다.
from collections import Counter
from itertools import combinations
def solution(orders, course):
ans = []
for n in course:
comb_li = []
for order in orders:
comb_li.extend(list(combinations(sorted(order), n)))
counter = Counter(comb_li)
if counter and max(counter.values()) > 1:
ans.extend([''.join(k) for k in counter if counter[k] == max(counter.values())])
return sorted(ans)
728x90
반응형