본문 바로가기
Algorithm/Programmers

[프로그래머스] 72411 파이썬 - 메뉴 리뉴얼

by chobbo 2024. 9. 24.

문제



풀이

문제를 보면 orders의 길이와 course의 길이가 매우 짧게 주어진다.

따라서 모든 경우의 수(조합)을 구하여 해결할 수 있는 문제이다.

단, 조합을 뽑은 후 반드시 정렬을 해서 딕셔너리에 넣어야 올바른 정답을 얻을 수 있다.

 

 

오늘 배운 것

 

딕셔너리 key값 탐색

 if frequency[i] not in new_frequency.keys()

 

파이썬 딕셔너리에 값을 추가할 때 그동안은 위와 같이 key값들에 접근해서 이미 존재하는 키인지 확인해왔다.

 

if i not in new_frequency

그러나, in 키워드는 딕셔너리에서 기본적으로 키만 확인한다고 한다.

따라서 new_frequency.keys()로 작성하지 않고 new_frequency로 적어도 동일하게 코드가 작동한다.

위와 같이 작성하여 코드의 간결성을 키울 수 있다.

 

Counter 모듈


나는 아래 코드처럼 복잡하게 구현했지만, 파이썬의 Counter 모듈을 사용하면 좀 더 쉽게 풀 수 있다.

Counter는 리스트에 원소가 몇 번 나왔는지 직접 계산해주는 모듈이다.
또한 Counter의 most_common() 메서드를 통해 데이터의 개수가 많은 순으로 정렬된 배열을 얻을 수도 있다.

 

코드

from itertools import combinations

def solution(orders, course):
    answer = []
    frequency = {}
    
    # 주문 별 조합 뽑기
    for order in orders:
        for i in course:        
            for j in list(combinations(list(order),i)):
                j = list(j)
                j.sort()
                frequency_key = "".join(j)

                if frequency_key not in frequency:
                    frequency[frequency_key] = 0
                frequency[frequency_key] += 1
    
    new_frequency = {}
    
    # key = 코스 수, value = (주문된 횟수, 요리 알파벳)
    for i in frequency: 
        if frequency[i] >= 2:
            if len(i) not in new_frequency:
                new_frequency[len(i)] = []
            new_frequency[len(i)].append((frequency[i],i))

    # 각 코스 별로 가장 많이 주문된 요리 뽑아 정답 배열에 넣기
    for i in new_frequency:
        array = sorted(new_frequency[i],reverse = True)
        max_order_count = array[0][0]

        for j in array:
            if j[0] == max_order_count:
                answer.append(j[1])
    
    answer.sort()
           
    return answer

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr