문제

문제

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

 

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

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

programmers.co.kr

 

처음 작성한 코드

def solution(orders, course):
    from itertools import combinations
    answer = []
    for i in course:
        dic = {}
        for j in orders:
            for s in combinations(sorted(j),i):
                if ''.join(s) in dic.keys(): dic[''.join(s)] +=1
                else: dic[''.join(s)] = 1
        if not dic: continue
        maxNum = max(dic.items(), key = lambda x:x[1])[1]
        for x in dic.items():
            if x[1]==maxNum and maxNum>=2:
                answer.append(x[0])
    return sorted(answer)
  1. orders를 돌면서 course 갯수만큼 combinations을 구한다.
  2. dictionary 형 변수인 dic에 모든 조합을 넣을건데 이미 구한 조합에 있으면 count를 올리고 없으면 새로 추가할 것이다.
  3. max의 key를 몇 번 사용됐는지 위에서 구한 값을 기준으로 하여 제일 많이 주문된 수를 maxNum에 저장한다.
  4. dic을 돌면서 제일 많이 주문된 수와 같고 2번 이상 주문된 조합(메뉴조합)만 answer에 넣는다.

 

코드 리뷰 후

def solution(orders, course):
    from itertools import combinations
    from collections import Counter
    answer = []
    for i in course:
        dic = []
        for j in orders:
            for s in combinations(sorted(j),i):
                dic.append(''.join(s))
        dic = Counter(dic).most_common()
        maxNum = dic[0][1]
        for x in dic:
            if x[1]==maxNum and maxNum>=2:
                answer.append(x[0])
    return sorted(answer)

 

깨달은 점

  • list를 Counter 하면 어떤 원소가 몇개있는지 dictionary 형태로 반환해준다. 만약 리스트가 ['a', 'a', 'c'] 라면 {'a':2, 'c':1} 이렇게 반환을 해주는데, Counter의 most_common()함수를 실행하면 제일 많이 사용한 순으로 정렬을 해준다.
  • 재밌다 포헹

'Programmers' 카테고리의 다른 글

[프로그래머스] 순위 검색  (0) 2021.01.27
[프로그래머스] 신규 아이디 추천  (0) 2021.01.27
[프로그래머스] 수식 최대화  (0) 2021.01.25
[프로그래머스] 스킬트리  (0) 2021.01.23
[프로그래머스] 압축  (0) 2021.01.22