메뉴 리뉴얼 (Programmers 72411)

문파이더맨·2021년 7월 9일
0

Algorithm

목록 보기
50/58
post-thumbnail

🧑‍💻 메뉴 리뉴얼

  • 레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다.
  • 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서 새로운 메뉴를 제공하기로 결정했습니다. 어떤 단품메뉴들을 조합해서 코스요리 메뉴로 구성하면 좋을 지 고민하던 "스카피"는 이전에 각 손님들이 주문할 때 가장 많이 함께 주문한 단품메뉴들을 코스요리 메뉴로 구성하기로 했습니다.
  • 단, 코스요리 메뉴는 최소 2가지 이상의 단품메뉴로 구성하려고 합니다. 또한, 최소 2명 이상의 손님으로부터 주문된 단품메뉴 조합에 대해서만 코스요리 메뉴 후보에 포함하기로 했습니다.
  • 예를 들어, 손님 6명이 주문한 단품메뉴들의 조합이 다음과 같다면,
    • (각 손님은 단품메뉴를 2개 이상 주문해야 하며, 각 단품메뉴는 A ~ Z의 알파벳 대문자로 표기합니다.)
손님 번호주문한 단품메뉴 조합
1번 손님A, B, C, F, G
2번 손님A, C
3번 손님C, D, E
4번 손님A, C, D, E
5번 손님B, C, F, G
6번 손님A, C, D, E, H
  • 가장 많이 함께 주문된 단품메뉴 조합에 따라 "스카피"가 만들게 될 코스요리 메뉴 구성 후보는 다음과 같습니다.
코스 종류메뉴 구성설명
요리 2개 코스A, C1번, 2번, 4번, 6번 손님으로부터 총 4번 주문됐습니다.
요리 3개 코스C, D, E3번, 4번, 6번 손님으로부터 총 3번 주문됐습니다.
요리 4개 코스B, C, F, G1번, 5번 손님으로부터 총 2번 주문됐습니다.
요리 4개 코스A, C, D, E4번, 6번 손님으로부터 총 2번 주문됐습니다.

문제

  • 각 손님들이 주문한 단품메뉴들이 문자열 형식으로 담긴 배열 orders, "스카피"가 추가하고 싶어하는 코스요리를 구성하는 단품메뉴들의 갯수가 담긴 배열 course가 매개변수로 주어질 때, "스카피"가 새로 추가하게 될 코스요리의 메뉴 구성을 문자열 형태로 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

제한 사항

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

입출력 예

orderscourseresult
["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"][2, 3, 4]["AC", "ACDE", "BCFG", "CDE"]
["ABCDE", "AB", "CD", "ADE", "XYZ", "XYZ", "ACD"][2, 3, 5]["ACD", "AD", "ADE", "CD", "XYZ"]
["XYZ", "XWY", "WXA"][2, 3, 4]["WX", "XY"]

🧑‍💻 해결방법

  • 리스트 두 개를 활용해서 딕셔너리에 key와 value를 만들어서 끌어오려 했으나 실패
  • 리스트의 길이를 기준으로 sort했으나 포함관계 여부를 따지려면 시간복잡도가 높아져서 포기
  • combination과 Counter를 활용해서 딕셔너리 생성 후 counting한 수를 기준으로 answer 리스트에 삽입

🧑‍💻 코드

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

   for c in course :
       tmp = []
       for order in orders :
           com = combinations(sorted(order), c)
           tmp += com
       odic = Counter(tmp)
       print (odic)

       if odic :
           m = max(list(odic.values()))
           if m >= 2 :
               for key, value in odic.items() :
                   if odic[key] == m :
                       answer.append(''.join(key))

   return sorted(answer)

🧑‍💻 총평

  • Conter를 잘 사용하지 않았었는데 굉장히 효율적으로 counting이 가능한 것을 보니 앞으로 익숙해져야겠다고 느꼈다.
  • 생각한 로직은 비슷했으나 적용에서의 문제를 따져보면 좀 더 모듈을 잘 활용하는 방법을 알아야겠다.
  • 코드를 보는 눈을 넓히는 것도 중요하지만 내 스스로에게 더 성장시키는 것이 중요하다고 판단된다.
profile
Sever 개발할래요.

0개의 댓글