본문 바로가기
문제 풀이/프로그래머스 (Programmers)

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

by 희조당 2022. 6. 22.
728x90

https://programmers.co.kr/learn/courses/30/lessons/72411?language=python3 

 

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

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

programmers.co.kr


 문제 풀이

for course in course:
        for order in orders:
            n_order = ''.join(sorted(order))
            for combo in [''.join(i) for i in list(combinations(n_order, course))]:
                if combo in combos[course-1]: combos[course-1][combo] += 1
                else: combos[course-1][combo] = 1

파이썬 라이브러리 itertool 중 combinations(조합)을 이용해서

orders에 대한 조합들을 다 dict의 키 값으로 때려 박는다.

여기서 order 중에 알파벳 순서로 정렬이 안된 값이 있어 정렬을 해야 한다.

dict가 course의 max 값만큼 있는 이유는 course에 따라 정리를 하기 위함이다.

 

for combo in combos:
        for c in list(combo.keys()):
            if combo[c] < 2: del combo[c]

각 dict에 대해 주문된 횟수가 2 미만의 값은 정리한다.

 

for combo in combos:
        if combo:
            max_val = max(combo.values())
            for ele in combo:
                if combo[ele] == max_val: answer.append(ele)

각 코스에 최대 주문 회수를 찾아 결과 리스트에 넣어준다.

 느낀 점

combinations을 몰랐다면 백트래킹으로 직접 구현했을 것 같다. 그 생각만 하니 엄청 아찔하다..

중간에 발생하는 에러들 (TypeError, ValueError) 때문에 정말 정신이 나가는 줄 알았다.

특히 'for course in course: ' 문이 위에서는 되는데 왜 아래에선 안되는지 미치는 줄 알았다...

코테 생각하면 아직 막막하다..

 코드

from itertools import combinations

def solution(orders, course):
    answer = []
    combos = [{} for i in range(course[-1])]

    for course in course:
        for order in orders:
            n_order = ''.join(sorted(order))
            for combo in [''.join(i) for i in list(combinations(n_order, course))]:
                if combo in combos[course-1]: combos[course-1][combo] += 1
                else: combos[course-1][combo] = 1

    for combo in combos:
        for c in list(combo.keys()):
            if combo[c] < 2: del combo[c]

    for combo in combos:
        if combo:
            max_val = max(combo.values())
            for ele in combo:
                if combo[ele] == max_val: answer.append(ele)

    return sorted(answer)

댓글