from collections import defaultdict
from itertools import combinations as comb
def solution(orders, course):
# 모든 조합을 딕셔너리에 기록
dict = defaultdict(int)
for x in orders:
get_all_comb(list(x), course, dict)
# 횟수가 2이상인 조합만 [조합, 횟수]으로 result에 append
result = [[i, dict[i]] for i in dict if dict[i] >= 2]
# 횟수가 큰 순서로 정렬
result.sort(key=lambda x: -x[1])
answer = []
added = {} # 해당 매뉴의 횟수 기록
# 메뉴 확정
for x in result:
# 해당 메뉴가 없으면 추가
if len(x[0]) not in added:
answer.append(x[0])
added[len(x[0])] = x[1]
# 해당 메뉴가 있지만 횟수가 같으면 추가
elif added[len(x[0])] == x[1]:
answer.append(x[0])
return sorted(answer)
def get_all_comb(arr, course, dict):
for i in course:
for x in list(comb(arr, i)):
dict[''.join(sorted(list(x)))] += 1
2021 카카오 블라인드, 해시
1. dict : 각 조합의 등장 횟수를 저장
2. get_all_comb : 모든 조합을 이용해서 dict에 추가 (각 손님마다 반복), course만큼 조합, 정렬, 문자열화
3. result : dict의 각 키의 값이 2 이상인 [키, 값] 집합
4. result를 값이 큰 순서대로 정렬
5. added : 코스요리 길이의 최대 등장 횟수 기록
- 처음 등장하는 코스 요리의 길이라면 append
- 이미 등장한 코스 요리의 길이라면 값을 비교하여 같으면 append
6. 정렬하여 리턴
딕셔너리를 이용해서 풀었다.
다른 사람의 풀이를 보니까 collections의 Counter를 사용해서 풀이가 있었다.
나는 딕셔너리를 두 번 이용해서 풀었는데 간단하게 Counter를 이용해서 풀었다.
아직 갈길이 멀다...
다른 풀이
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 : 배열에 원소가 몇 번이 나왔는지 기록해준다. [원소, 횟수]
Counter의 most_common 메서드 : 데이터가 많은 순으로 정렬해서 반환
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2 - 거리두기 확인하기 (파이썬) (0) | 2022.04.01 |
---|---|
[프로그래머스] Lv2 - 괄호 변환 (파이썬) (0) | 2022.04.01 |
[프로그래머스] Lv2 - 행렬 테두리 회전하기 (파이썬) (0) | 2022.03.31 |
[프로그래머스] Lv2 - 짝지어 제거하기 (파이썬) (0) | 2022.03.30 |
[프로그래머스] Lv2 - 124 나라의 숫자 (파이썬) (0) | 2022.03.30 |