https://school.programmers.co.kr/learn/courses/30/lessons/72411
from itertools import combinations
from collections import defaultdict
def solution(orders, course):
answer = []
for pick_num in course: # pick_num: 몇 개로 코스요리를 구성할지
default_dict = defaultdict(int)
for order in orders:
for alphas in combinations(order, pick_num):
default_dict[''.join(sorted(alphas))] += 1
if default_dict: # max()에 empty 전달 방지용
max_count = max(default_dict.values())
for k, v in default_dict.items():
if v == max_count and max_count >= 2:
answer.append(k)
return sorted(answer)
위 코드를 좀 더 pythonic하게 바꾸면 다음과 같다. max()를 체크하는 조건을 list comprehension 안에 넣으면 max()에 empty값이 전달될 여지를 없앨 수 있다.
다만, 이러면 매번 max값을 구해서 시간측면에서 비효율적이다.
from itertools import combinations
from collections import defaultdict
def solution(orders, course):
answer = []
for pick_num in course:
default_dict = defaultdict(int)
for order in orders:
for alphas in combinations(order, pick_num):
default_dict[''.join(sorted(alphas))] += 1
answer += [k for k,v in default_dict.items() if v>=2 and v == max(default_dict.values())]
return sorted(answer)
collections.defaultdict를 안쓰고 collections.Counter를 쓰는 방법도 있다. 두 방법 모두 갯수를 세는 방법이다.
from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for pick_num in course:
num_combs = []
for order in orders:
for alphas in combinations(order, pick_num):
num_combs.append(''.join(sorted(alphas)))
counter_most_common = Counter(num_combs).most_common()
answer += [k for k,v in counter_most_common if v>=2 and v==counter_most_common[0][1]]
return sorted(answer)