본문 바로가기
Algorithm/프로그래머스

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

by _temp 2022. 3. 31.
 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

from collections import defaultdict
from itertools import combinations as comb


def solution(orders, course):
    # 모든 조합을 딕셔너리에 기록
    dict = defaultdict(int)
    for x in orders:
        get_all_comb(list(x), course, dict)
    # 횟수가 2이상인 조합만 [조합, 횟수]으로 result에 append
    result = [[i, dict[i]] for i in dict if dict[i] >= 2]
    # 횟수가 큰 순서로 정렬
    result.sort(key=lambda x: -x[1])
    answer = []
    added = {}  # 해당 매뉴의 횟수 기록
    # 메뉴 확정
    for x in result:
        # 해당 메뉴가 없으면 추가
        if len(x[0]) not in added:
            answer.append(x[0])
            added[len(x[0])] = x[1]
        # 해당 메뉴가 있지만 횟수가 같으면 추가
        elif added[len(x[0])] == x[1]:
            answer.append(x[0])
    return sorted(answer)


def get_all_comb(arr, course, dict):
    for i in course:
        for x in list(comb(arr, i)):
            dict[''.join(sorted(list(x)))] += 1

 

2021 카카오 블라인드, 해시
1. dict : 각 조합의 등장 횟수를 저장
2. get_all_comb : 모든 조합을 이용해서 dict에 추가 (각 손님마다 반복), course만큼 조합, 정렬, 문자열화
3. result : dict의 각 키의 값이 2 이상인 [키, 값] 집합
4. result를 값이 큰 순서대로 정렬
5. added : 코스요리 길이의 최대 등장 횟수 기록
    - 처음 등장하는 코스 요리의 길이라면 append
    - 이미 등장한 코스 요리의 길이라면 값을 비교하여 같으면 append
6. 정렬하여 리턴

 

딕셔너리를 이용해서 풀었다.

다른 사람의 풀이를 보니까 collections의 Counter를 사용해서 풀이가 있었다.

나는 딕셔너리를 두 번 이용해서 풀었는데 간단하게 Counter를 이용해서 풀었다.

아직 갈길이 멀다...


다른 풀이

import collections
import itertools

def solution(orders, course):
    result = []

    for course_size in course:
        order_combinations = []
        for order in orders:
            order_combinations += itertools.combinations(sorted(order), course_size)

        most_ordered = collections.Counter(order_combinations).most_common()
        result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]

    return [ ''.join(v) for v in sorted(result) ]

 

Counter : 배열에 원소가 몇 번이 나왔는지 기록해준다. [원소, 횟수]
Counter의 most_common 메서드 : 데이터가 많은 순으로 정렬해서 반환