2021 KAKAO BLIND RECRUITMENT : 메뉴 리뉴얼

Minhee kang·2021년 6월 28일
0

문제 보러 가기 👈 클릭!

💡 풀이

✔ 풀이 방법 1

step 1)
딕셔너리 자료형과 조합 모듈(from itertools import combinations)을 사용하여 코스요리 메뉴별 시킨 사람수 카운트

ex) menu_cnt = {('A', 'C') : 3 ,  ...}

이때, ('A', 'C')와 ('C', 'A')는 같은경우 이므로 이런 경우가 안생기게 하려면 조합에 사용되는 자료가 정렬되어 있어야함.

-> 문자열은 sorted('문자열')을 사용하면 정렬 된 리스트를 반환 하기 때문에 반환 된 리스트를 사용하여 조합을 구함

step 2)
step1에서 만든 딕셔너리를 돌며 새로운 딕셔너리 { 메뉴 개수: [사람들이 가장 많이 시킨 수, [그때의 메뉴 조합]] } 을 계속 갱신하여 저장

step 3)
step2에서 만든 딕셔너리 중 [그때의 메뉴 조합] 들을 return 할 리스트로 연장

최종적으로 정렬 된 값을 return 해야하므로 리스트.sort()를 사용하여 정렬한 뒤 return

✔ 풀이 방법 2 (collections모듈의 Counter클래스 사용)

step 1)
풀이방법1과 마찬가지로 코스요리 메뉴별 시킨 사람수 카운트

풀이방법1과 다른점은 각 코스메뉴별 시킨 사람수를 카운트 할 때, collections 모듈의 Counter클래스를 사용한다는 것임

코스요리 메뉴별 시킨 사람수 카운트를 정렬함 (Counter클래스의 most_common() 사용)

step 2)
max_cnt 의 초기값 = 2

정렬 된 리스트를 반복하며
시킨 사람수가 max_cnt 보다 클때:
answer에 추가하고, max_cnt변경
같을 때:
answer에 추가
else:
반복문 빠져나감

step 3)
answer를 정렬하여 반환

💡 전체 소스 코드 1 (풀이방법 1)

from itertools import combinations

def solution(orders, course):
    
    menu_cnt = {}   #코스요리메뉴 : 시킨 사람 수 
    for s in orders:
        for n in course:
            for i in combinations(sorted(s), n):
                print(i)
                menu_cnt[i] = menu_cnt.get(i, 0) + 1
    
    dict = { n: [2, []] for n in course }  # 키 : [시킨 사람 수, [메뉴]]
    for key in list(menu_cnt.keys()):
        if  dict[len(key)][0] == menu_cnt[key]:
            dict[len(key)][1].append(''.join(key))
        elif dict[len(key)][0] < menu_cnt[key]:
            dict[len(key)].clear()
            dict[len(key)] = [menu_cnt[key], [''.join(key)]]
            
    answer = []
    for val in dict.values():
        if val[1]:
            answer.extend(val[1])
    answer.sort()

    return answer

💡 전체 소스 코드 2 (풀이방법 2)

from itertools import combinations
from collections import Counter

def solution(orders, course):

    answer = []
    
    for n in course:
        menu = []
        for s in orders:
            menu += list(combinations(sorted(s), n))
        menu_cnt_s = Counter(menu).most_common()
        max_cnt = 2
        for menu_cnt in menu_cnt_s:
            if menu_cnt[1] > max_cnt:
                answer.append(''.join(menu_cnt[0]))
                max_cnt = menu_cnt[1]
            elif menu_cnt[1] == max_cnt:
                answer.append(''.join(menu_cnt[0]))
            else:
                break
    
    answer.sort()
    
    return answer

0개의 댓글

관련 채용 정보