https://school.programmers.co.kr/learn/courses/30/lessons/72411
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from itertools import combinations
def solution(orders, course):
dic = {}
result = []
for n in course:
dic[n] = {}
for order in orders:
for item in combinations(sorted(order), n):
menu = ''.join(item)
dic[n][menu] = dic[n].get(menu, 0) + 1
result += [k for k, v in dic[n].items() if (max(dic[n].values()) == v) and (v >= 2)]
result.sort()
return result
저는 리스트의 조합을 만들어주는 itertools의 combinations 을 사용하여 문제를 해결하였습니다.
먼저 dic, result 변수를 초기화 해줍니다, 변수들은 아래와 같은 용도로 사용할 것 입니다.
- dic : 코스종류(n) : { key = 코스요리(menu) : value = 주문 수)
- result : 결과를 담을 리스트
코스종류(n)과 주문받은 단품 메뉴(orders)를 반복하면서 코스요리를 조합(combinations)합니다.
dic[n]은 코스종류마다 생성되는 코스요리와 코스요리의 수를 저장할 수 있도록 합니다.
그리고 combinations 함수를 적용할 때 sorted(order)로 단품 메뉴를 정렬하여 적용합니다.
item으로 부터 각 조합들을 join(item)하여 딕셔너리 자료구조에 저장합니다.
딕셔너리의 get(menu, 0)을 하여 menu가 딕셔너리에 존재하지 않는다면 0, 존재한다면 value + 1을 합니다.
가장 많이 주문된 조합을 max()함수를 사용하여 추출해주고 주문된 조합의 수가 2개 이상인 코스요리만 추출합니다.
마지막으로 result 리스트를 정렬하여 반환합니다.
예를들어 확인해보겠습니다.
orders = ['XYZ', 'XWY', 'WXA'], course = [2,3,4] 라고 가정한다면
전체 딕셔너리에 저장되는 값은 다음과 같습니다.
코스종류(n)이 2일 때는
XYZ = [XY, XZ, YZ] 값이 나오게 됩니다.
XWY는 sorted()함수로 정렬이 되어 WXY가 됩니다.
WXY(XWY) = [WX, WY, XY]
WXA 또한 정렬이되어 AWX가 됩니다.
AWX(WXA) = [AW, AX, WX]
따라서 'XY'와 'WX'가 2개로 가장 많은 값을 갖게 됩니다.
그리고 나머지 값들은 조합의 수가 1개로 조건에 맞지 않기 때문에 추출되지 않습니다.
코스종류가 4인 경우에는 4개 이상의 단품메뉴가 없기 때문에 계산되지 않습니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 개인정보 수집 유효기간 파이썬(Python) (0) | 2023.01.11 |
---|---|
[코딩테스트] 프로그래머스 [1차] 뉴스 클러스터링 파이썬(Python) (0) | 2023.01.07 |
[코딩테스트] 프로그래머스 [3차] 압축 파이썬(Python) (0) | 2023.01.05 |
[코딩테스트] 프로그래머스 가장 긴 팰린드롬 파이썬(Python) (0) | 2023.01.04 |
[코딩테스트] 프로그래머스 더 맵게 파이썬(Python) (0) | 2023.01.03 |