[Python/프로그래머스] 2021 KAKAO BLIND RECRUITMENT: 메뉴 리뉴얼

👀 문제

https://programmers.co.kr/learn/courses/30/lessons/72411

👊 도전

1. 설계

  1. order의 조합을 구한다.
  2. hashmap에 조합 별 개수를 세서 저장한다.
  3. 조합 길이의 최댓값을 size에 저장한다.
  4. 조합 빈도수(hashmap)이 2 이상이고 최댓값(size)인 결과를 answer에 넣는다.
  5. answer을 오름차순 정렬하여 리턴한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 *
 * @author HEESOO
 *
 */
from itertools import combinations

def solution(orders, course):
    answer = []
    hashmap={}
    size={}
    for order in orders:
        for i in course:
            for comb in combinations(order, i):
                menu="".join(sorted(comb))
                if menu in hashmap:
                    hashmap[menu]+=1
                else:
                    hashmap[menu]=1
                if len(menu) in size:
                    size[len(menu)]=max(size[len(menu)], hashmap[menu])
                else:
                    size[len(menu)]=hashmap[menu]
    
    for i in hashmap:
        if hashmap[i]>1 and hashmap[i]==size[len(i)]:
            answer.append(i)
    return sorted(answer)

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 조합을 구한다
    • combinations로 조합을 구한다.
    • “XY”, “YX”는 같은 것으로 생각하기 때문에 sorted()로 오름차순 정렬한 후, join()으로 문자열을 합친다.
    • hashmap에 menu가 있다면 하나 증가, 없다면 1을 넣어준다.
    • size는 문자열 길이의 max를 저장한다. size에 len(menu) 값이 들어가있다면 최댓값으로 갱신, 없다면 현재 hashmap[menu]를 넣는다.
  2. 조합 중 조건에 맞는 값을 리턴한다
    • 조합 횟수가 2 이상이고 길이가 최댓값인 것만 answer에 넣는다.
    • 오름차순으로 정렬하여 리턴한다.

👏 해결 완료!