[Python Algorithm] 프로그래머스 메뉴 리뉴얼 - Menu Renewal

Chani·2022년 1월 24일
0

알고리즘

목록 보기
3/16


문제 설명

course에 따라 가장 인기있는 단품메뉴의 조합을 만들어야한다.
course가 2인 경우에는 orders에서 길이가 2인 단품메뉴의 조합중 가장 많은 선택을 받은 조합을 찾고, course가 3인 경우에는 길이가 3인 단품메뉴의 조합중 가장 많은 선택을 받은 조합을 찾아서 해당 결과값을 모두 result 배열에 저장하고 오름차순으로 정렬하여 출력하면 된다.
가장 많은 선택을 받은 조합이 여러개라면 해당 조합을 모두 result 배열에 넣어서 출력해주면 된다.

풀이 과정

원래는 python의 default dict를 사용하여 구현하려고 했는데 구글에 검색을 해보니 Counter라는 자료구조가 있었다.
Counter는 list나 문자열의 요소들의 개수를 자동으로 세어주는 자료구조인데, dict를 사용해서 구현하려던 부분을 미리 구현해놓은 느낌이었다.
조합을 구해야하기 때문에 combinations 함수를 사용하여 해당 부분을 구현해주었고, combinations는 조합의 결과를 튜플로 저장해주기 때문에 올바른 결과값 반환을 위해 join을 사용하여 튜플을 문자열로 변환해주었다.

처음에는 마지막에 반환해주는 배열인 ans 배열만 마지막에 정렬해주었는데 이렇게 구현을 하니까 마지막 3번째 케이스가 통과가 안됐다.
그 이유는 조합을 만들때 XW와 WX를 다른 케이스로 만들어줬기 때문이었다.
이 문제를 해결하기위해 combinations 함수에 order를 넣기 전에 문자열을 한번 정렬해주고 넣어주었다.


최종 코드

from itertools import combinations
from collections import Counter

def solution(orders, course):
    ans = []
    for C in course:
        temp = []
        for order in orders:
            comb = combinations(sorted(order), C)
            temp += comb
        counter = Counter(temp)
        if len(counter) != 0 and max(counter.values()) > 1:
            for i in counter:
                if counter[i] == max(counter.values()):
                    ans.append(''.join(i))
    return sorted(ans)

결과


메뉴 리뉴얼 문제 출처
GitHub 코드

profile
프론트엔드에 스며드는 중 🌊

0개의 댓글