머신러닝 개발자의 러닝머신

[프로그래머스 2021 KAKAO BLIND RECRUITMENT: 메뉴 리뉴얼] (Python) 본문

알고리즘/프로그래머스

[프로그래머스 2021 KAKAO BLIND RECRUITMENT: 메뉴 리뉴얼] (Python)

oongsong 2023. 5. 2. 23:28
반응형

문제링크 https://school.programmers.co.kr/learn/courses/30/lessons/72411

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 유형 

  • 문자열, 딕셔너리 자료형 

접근 방법 & 풀이 

  • 손님들의 주문 목록마다 세트메뉴 가능한 모든 조합 구하기 
    이때, course 의 세트메뉴 구성 단품 갯수에 따라 관리하기 
  • course 세트의 메뉴 갯수에 따라 최대 주문 조합 리턴 

코드 

from itertools import combinations 
def solution(orders, course):
    answer = []
    
    n = len(course)
    candidate_dic = [{} for _ in range(n)] #course 의 세트의 단품 갯수에 따라 메뉴조합 관리 
    for order in orders: #모든 주문 목록마다
        lst = list(order)
        lst.sort() #알파벳 오름차순 정렬 
        #메뉴 갯수마다, 가능한 모든 조합 구하기 
        for i in range(n): 
            num = course[i]
            if num > len(lst): #주문한 메뉴 갯수가 세트의 메뉴 갯수보다 작은 경우 continue 
                continue 
            for comb in combinations(lst, num): #가능한 모든 조합 구하기 
                menu = "".join(comb)
                candidate_dic[i][menu] = candidate_dic[i].get(menu, 0)+1
                
    # 각 course의 메뉴 갯수마다 가장 큰 주문 빈도를 가지는 메뉴 조합 최종 선택  
    for i in range(n): 
        if not candidate_dic[i]: #가능한 메뉴 조합이 없는 경우 continue 
            continue 
        max_cnt = max(list(candidate_dic[i].values())) #최대 주문 빈도
        if max_cnt <2: #최대 빈도가 2번 미만이면 세트 구성 불가능  
            continue 
        for menu in candidate_dic[i]:
            if candidate_dic[i][menu] == max_cnt: # 최대 빈도를 가지는 메뉴 모두 추가 
                answer.append(menu)
    
    answer.sort() #메뉴 사전순 정렬
    
    return answer

 

 

반응형