알고리즘/프로그래머스문제풀이

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

개발자 덕구🐾 2022. 6. 29. 11:51
728x90

 

 

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

 

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

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

programmers.co.kr

 

 


 

문제 핵심!!!

 

1. 각 course별로 가장 많이 함께 주문된 메뉴 구성이 반환되는데 만약 여러개라면 모두 배열에 담는다.

 

그러니까 2개로 묶어진 요리들이 있다면 

그 중에서 가장 많이 함께 주문된 메뉴구성으로 return 한다.

만약에 가장 많이  함께 주문된 메뉴 구성이 여러개면 모두 return!!

 

 

 

 

 

2. orders는 sort되지않았다.  -> sort 해주어야한다. 

 

orders의 4번째 예시 

"XWY"를 보면 알 수 있다. 

알파벳 순서로 하면 WXY가 된다. 이렇게 만들기위해 combinations(sorted(order,num)) 을 해준다. 

XW와 WX는 다르다고 생각하기 때문에 정렬을 해주어 WX 로 맞추어 줘야한다. 

 

 

 

3. if count를 하는 이유

4번째 예시에서 4글자가 나올 수가 없으므로 

count가 비어있게 된다.

여기에서 max를 사용해서 가장 많이 주문된 횟수를 구하면 에러가 발생하므로 if count를 해주었다. 

 

 


 

 

💻 코드 : 

 

from itertools import combinations
from collections import Counter

def solution(orders, course):
    answer = []
    # 각 개수별로 for문 돈다. 
    for num in course :
        array =[]
        # 주문 목록을 돈다. 
        for order in orders :
            array.extend(combinations(sorted(order),num))
        count = Counter(array)
        
        if count :
        	# 해당 개수의 주문들 중 가장 빈도가 높은 수를 고른다. 
            MAX = max(count.values())
            if  MAX >= 2:
                for key , value in count.items() :
                	# MAX(가장 높은 빈도의 수)인 key들을 넣는다.
                    if value == MAX :
                        answer.append("".join(key))
    return sorted(answer)

 

 

1. 조합의 내부 개수만큼 for문을 돌린다.

2. 주문들을 돌면서 for문을 돌린다. 

3. Counter로 각각의 개수를 구한다.

4. 2개보다 많이 나왔고 그 MAX값의 빈도로 나온 값들을 answer에 넣는다.

 

 

 

 

 

 

 

 

 

 

 

틀린 코드 : 

from itertools import combinations 
from collections import defaultdict 

def solution(orders, course):
    answer = []
    dic = defaultdict(int)
    for char in orders :
        for i in range(2,len(char)+1) :
            tmp=list(combinations(char,i))
            for j in tmp :
                dic[j] +=1  
    for k,v in dic.items() :
        if v >=2 and len(k) in course:
            answer.append(''.join(k))
    answer.sort()
    return answer

 

결과가 이렇게 나온다. 틀린 이유는 2개보다 크면 다 넣었기 때문이다. 

이렇게가 아니라 각각의 개수(course)별로 가장 많이 나온 빈도를 구해서 그 빈도인 메뉴만 answer에 넣어야하는 것이다.

 

 

 

 

 

combinations을 이용한다!!

combinations : 순서가 달라진거는 의미 없음 

permutations : 순서가 달라지면 달라진거다.  

 

 

 

 

 

 

 

참고 블로그 : 

 

https://velog.io/@eazyan/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4.-%EB%A9%94%EB%89%B4-%EB%A6%AC%EB%89%B4%EC%96%BC-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%92%80%EC%9D%B4

 

프로그래머스. 메뉴 리뉴얼 파이썬 풀이

프로그래머스. Level 2. 메뉴 리뉴얼 파이썬 풀이

velog.io

https://ourcstory.tistory.com/414

 

파이썬(Python) 리스트 모든 조합 구하기 (combination vs permutations vs product)

파이썬 (Python)에서 리스트에 있는 값들의 모든 조합을 구하기 파이썬에서 리스트에 있는 값들의 모든 조합을 구하기 위해서는 여러가지 방법이 있다. 파이썬 기본 라이브러리인 itertools을 사용

ourcstory.tistory.com

 

반응형