본문 바로가기
코딩 테스트

[카카오][Python]메뉴리뉴얼

by 카프리썬 2021. 7. 9.
728x90

아래의 문제는 카카오 채용 코딩테스트 내용이며 코드는 직접 푼 내용입니다.


메뉴리뉴얼

문제상황

요구사항

각 손님들이 주문한 단품메뉴들이 문자열 형식으로 담긴 배열 orders,

"스카피"가 추가하고 싶어하는 코스요리를 구성하는 단품메뉴들의 갯수가 담긴 배열 course가 매개변수로 주어질 때, "스카피"가 새로 추가하게 될 코스요리의 메뉴 구성을

문자열 형태로 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

 

제한사항

  • orders 배열의 크기는 2 이상 20 이하입니다.
  • orders 배열의 각 원소는 크기가 2 이상 10 이하인 문자열입니다.
    • 각 문자열은 알파벳 대문자로만 이루어져 있습니다.
    • 각 문자열에는 같은 알파벳이 중복해서 들어있지 않습니다.
  • course 배열의 크기는 1 이상 10 이하입니다.
    • course 배열의 각 원소는 2 이상 10 이하인 자연수가 오름차순으로 정렬되어 있습니다.
    • course 배열에는 같은 값이 중복해서 들어있지 않습니다.
  • 정답은 각 코스요리 메뉴의 구성을 문자열 형식으로 배열에 담아 사전 순으로 오름차순 정렬해서 return 해주세요.
    • 배열의 각 원소에 저장된 문자열 또한 알파벳 오름차순으로 정렬되어야 합니다.
    • 만약 가장 많이 함께 주문된 메뉴 구성이 여러 개라면, 모두 배열에 담아 return 하면 됩니다.
    • orders와 course 매개변수는 return 하는 배열의 길이가 1 이상이 되도록 주어집니다.

입출력

 


풀이과정

구현보다 문제를 이해하기하 어려웠다.

처음엔 길이를 기준으로 일치하는 문자열을 찾으려고 했다.

예를 들면, 요리2개코스일경우 orders에서 길이가2개인거뽑고, 얘네랑 일치하는 문자열이 또 orders에서 검색하려고..

하지만 너무 시간이 오래걸리는 것 같았다. 길이를 확인하려고 배열을 검사하고, 또 일치하는지 검사해야하니..

 

결국 길이로 문자열을 찾는게 아니라 길이에 해당하는 만큼 조합의 수를 뽑는방법으로 변경했다.

예를 들면, 요리2개코스일경우 전체 orders들에 대해서 모두 2개씩 뽑는 것이다.

 

2021.05.26 - [Python] 파이썬 순열(permutations )과 조합(combinations)

 

[Python] 파이썬 순열(permutations )과 조합(combinations)

순열 (permutations) 서로다른 n개에서 r개를 선택할때 순서를 고려하여, 중복없이 뽑을 경우의 수 nPr = n! / (n-r)! 예를 들어, A B C D 에서 순서에 상관있이, 중복없이 2가지를 뽑는 모든 경우의 수는? AB/

pearlluck.tistory.com

그리고 그 중에서 몇개가 있는지를 count하면, 주문된 단품메뉴 조합의 갯수가 된다. 

결국 최종적으로 주문된 단품메뉴 조합의 갯수의 max를 찾고, 그에 해당하는 메뉴들을 리턴한다. 

 

결과

내가 푼 정답코드결과

from itertools import combinations
from collections import Counter

def solution(orders,course):
    answer=[]
    for c in course:#c개 코스
        #c개로 뽑을 수 있는 메뉴조합
        order_combi=[]
        for order in orders:
            for combi in combinations(order,c):
                order_combi.append(''.join(sorted(combi)))
        print(str(c)+"개 코스")
        print(order_combi)
        #['AB', 'AC', 'AF', 'AG', 'BC', 'BF', 'BG', 'CF', 'CG'

        #메뉴구성후보
        order_count=Counter(order_combi).most_common()
        print(order_count)
        #메뉴조합,찾은횟수
        #[('AC', 4), ('CD', 3), ('CE', 3), ('DE', 3),

        #count가 가장 큰거만 result
        #count의 max 구하고
        max=0
        for oc in order_count:
            if oc[1]>=max:
                max=oc[1]
        #max에 해당하는 메뉴구성 추출
        #단 메뉴구성이1개일 경우 제외
        for oc in order_count:
            if oc[1]>=max and oc[1]!=1:
                answer.append(oc[0])
    return sorted(answer)

또는 다른방식으로 푼 코드 

 

배운점

  • Counter(배열).most_common() : {key:발견된횟수}를 저장하는 dict와 같다.
  • 콤비네이션 : 순서없이 n개를 뽑는 경우의 수 

참고 

참고한 블로그 링크

https://kyoung-jnn.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%8C%8C%EC%9D%B4%EC%8D%ACPython

반응형

$(document).ready(function() { var $toc = $("#toc"); $toc.toc({content: ".tt_article_useless_p_margin", headings: "h2,h3,h4"}); });