저고데

[프로그래머스]메뉴 리뉴얼 본문

프로그래머스

[프로그래머스]메뉴 리뉴얼

진철 2023. 1. 17. 22:48
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/72411

 

프로그래머스

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

programmers.co.kr

문제를 요약하자면 다음과 같다.

각 메뉴가 알파벳으로 나타난다.

각 손님들이 주문한 내용을 담고 있는 배열 orders와 코스요리에 몇 개의 메뉴가 포함이 되어야 하는지를 담고 있는 courses 배열이 주어진다.

이 때, 각 손님들이 가장 많이 주문한 메뉴를 토대로 코스요리를 짠다고 할 때, courses의 갯수에 맡게 어떻게 요리를 구성해야하는지를 반환해야 한다.

무작정 주문한 횟수가 많은 것을 코스요리로 담는 것이 아니라, 손님들이 여러 개의 메뉴를 주문내용에서 한 번에 시킬 때를 기준으로 한다.(이건 제가 뭐라고 설명해야할 지 모르겠네요 ㅠㅠ 아무튼 문제 내용이 이해하기가 조금 어렵습니다. ㅠㅠ)

 

코드를 작성하기 위한 순서는 다음과 같다.

1. 각 손님별로 주문한 메뉴에서 모든 경우의 수를 알기 위해 combinations을 import 해준다. permutations이 아닌 이유는, 메뉴의 구성의 수를 알아내는 것이기 때문에 (A, B), (B, A) 모두 같은 구성이기 때문이다.

2. 각 경우의 수마다 menu 배열에 넣어주고 Counter를 사용하여 총 몇 회인지 딕셔너리 형태로 바꾸어준다.
3. counter의 배열이 빈 배열이 아니고 가장 큰 횟수가 1보다 클 경우에 answer에 추가해준다.

from itertools import combinations #1번
from collections import Counter

def solution(orders, course):
    answer = []
    for i in course:
        menu=[]
        for j in orders:
            combo=combinations(sorted(j),i) #orders값이 정렬이 된 값이 아니기에 sorted(i)를 해주어야 한다.
            menu+=combo
        counter=Counter(menu) #2번 : Counter를 사용하여 각각의 총 횟수를 딕셔너리 형태로 변환해준다.
        
        if len(counter)!=0 and max(counter.values())>1:
            for k in counter:
                if counter[k]==max(counter.values()):
                    answer+=[''.join(k)]
    
    return sorted(answer)

해당 문제 같은 경우에는 combinations을 사용하여 손님이 주문한 메뉴의 모든 경우의 수(부분 집합)를 구하고

Counter를 사용하여 딕셔너리의 형태로 만들어주는 것이 가장 큰 핵심이었다.

(answer+=[''.join(K)] 부분에서 []를 사용하지 않아서 계속 오답이 나왔던 건 안비밀이다;; 여러분도 괄호 꼭 확인하세욤 ㅎ)

728x90
반응형