코딩테스트

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

pythaac 2021. 8. 7. 17:38
프로그래머스 코딩테스트 고득점 Kit의 문제입니다.

https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

문제

https://programmers.co.kr/learn/courses/30/lessons/72411

 

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

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

programmers.co.kr

 

내가 작성한 코드

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    
    for k in course:
        result = []
        for s in orders:
            for v in combinations(list(s), k):
                result.append(''.join(sorted(v)))
        
        result = Counter(result)
        
        for i in range(2, len(result)+2):
            res = result.most_common(i)
            if res[i-2][1] == 1:
                break
            answer.append(res[i-2][0])
            if i-1 < len(result) and res[i-2][1] != res[i-1][1]:
                break

    return sorted(answer)
  • 각 문자의 combination후 정렬한 문자열을 key로 하는 Counter 생성
  • most_common을 2개씩 뽑음
    • 첫 번째 인자의 frequency가 1이면 종료
    • 첫 번째 인자를 결과로 append
    • 두 번째 인자가 첫 번째 인자의 frequency와 같다면 다음 most_common도 확인
  • 정말 지저분한 코드다

 

다른 사람이 작성한 코드

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) ]
  • 정말 이쁘게 잘 정리했다
  • most_common 전체를 돌면서 most_common의 첫번째 frequency랑 같고, 1보다 크면 append 시킨다

 

기억해야할 것

  • 나는 for문에서 탐색을 멈춰야할 때는 break를 꼭 집어넣어야 한다고 생각한다
  • 그게 효율적으로 좋을 수는 있다(매우 매우 조금...)
  • 뭔가 보편적인? 일반화된 로직과 알고리즘을 생각하는 훈련을 해야겠다