🔗 Problem Link

 

프로그래머스

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

programmers.co.kr


❔Thinking

  • 사람들이 가장 많이 주문한(2명 이상) 단품메뉴(단품 2개 이상)를 조합해 새로운 코스메뉴를 반환한다.
  • 코스를 구성하는 단품 메뉴의 수가 가장 많은 메뉴만을 코스로 구성한다. ("AB" 4개, "AC" 2개일 경우 "AB"만 해당)

💻Solution

1. key를 통한 정렬 풀이

from itertools import combinations
from collections import Counter
def solution(orders, course):
    answer = Counter()
    for menu in orders:
        menu = sorted(menu)
        for i in course:
            if i > len(menu):
                break
            for j in combinations(menu, i):
                if len(''.join(j)) >= 2:
                    answer[''.join(j)] += 1

    answer = sorted(answer.items(), key=lambda x: (len(x[0]), x[1]), reverse=True)
    temp = [menu for menu in answer if menu[1] >= 2]

    if len(temp) < 1:
        return []
    result = [temp[0][0]]
    max_len = temp[0][1]

    for i in range(1,len(temp)):
        if len(temp[i][0]) == len(temp[i-1][0]):
            if temp[i][1] >= max_len:
                result.append(temp[i][0])
        elif temp[i][1] >= temp[i-1][1]:
            max_len = temp[i][1]
            result.append(temp[i][0])
    return sorted(result)

 

2. Counter most_common을 활용한 풀이 (출처 - programmers 다른 사람 풀이)

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()
        print('most_ordered: ', most_ordered)
        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) ]

🗝️keypoint

  1. Counter는 defaultdict와 유사하게, key가 없으면 새롭게 정의하고, KeyError 없이 0을 반환한다.
  2. Counter most_common을 활용하면, 개수에 관계없이(가장 많은 값이 여러개여도) 최빈값을 출력할 수 있다.
  3. course는 사람들이 주문한 단품메뉴 개수와 관계없이 주어진다.

+ Recent posts