반응형
programmers.co.kr/learn/courses/30/lessons/72411
문제 설명
문제에 대한 설명이 굉장히 길어 링크로 대체합니다.
주어진 orders중에 course 개수 만큼 코스요리로 재구성할 수 있는 메뉴들을 알파벳 오름차순으로 골라내면 됩니다.
풀이 과정
풀이 ①
딕셔너리를 이용하여, 메뉴를 구성할 수 있는 모든 경우의 수를 정리합니다.
각각의 경우에 대해 개수를 세어준 후에,
해당 케이스의 주문 횟수가 2회 이상이면서, 최댓값인 경우에 answer에 추가 합니다.
(문제에서, 각 course에 대해 가장 많이 주문된 것을 고르라고 했으므로. 단, 최댓값을 가지는 메뉴가 여러개일 경우 모두 나타내야 함)
마지막에 알파벳 순으로 정렬하여 나타내면 코드 완성입니다.
from itertools import combinations
def solution(orders, course):
answer = []
order_dict = {}
for i in range(len(course)):
for j in range(len(orders)):
for c in combinations(orders[j], course[i]):
cc = list(c)
cc.sort()
tmp = ''.join(cc)
if tmp in order_dict:
order_dict[tmp] += 1
else:
order_dict[tmp] = 1
print(order_dict)
for c in course:
arr = []
maxNum = 2
for k, v in order_dict.items():
if len(k) == c:
if maxNum < v:
arr = [k]
maxNum = v
elif maxNum == v:
arr.append(k)
for i in range(len(arr)):
answer.append(arr[i])
answer.sort()
return answer
print(solution(["XYZ", "XWY", "WXA"], [2,3,4]))
풀이 ②
파이썬의 내장모듈인 Counter를 이용합니다.
orders에 있는 모든 경우의 수를 order_list에 넣은 후에,
Counter를 통해 order_list의 각각 값들이 등장하는 횟수를 셉니다.
most_common() 메소드를 통해 빈도순으로 내림차순 정렬합니다.
그럼 order_list의 첫 번째 원소 order_list[0]의 두 번째 값 order_list[0][1]은 최대 횟수를 나타냅니다.
풀이 ①과 마찬가지로 주문 횟수가 2회 이상이면서, 최댓값인 경우에 answer에 추가 합니다.
from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for i in range(len(course)):
order_list = []
for j in range(len(orders)):
for comb in combinations(sorted(orders[j]), course[i]):
order_list.append("".join(comb))
if order_list:
order_list = Counter(order_list).most_common()
maxCnt = order_list[0][1]
for order in order_list:
if order[1] == maxCnt and order[1] > 1:
answer.append(order[0])
else:
break
answer.sort()
return answer
전체 문제 & 코드는 위의 깃에 정리되어 있습니다.
팔로우 & 맞팔은 환영입니다 !
반응형
'Algorithm > BruteForce' 카테고리의 다른 글
[백준] 14889 스타트와 링크 (Python 파이썬) (0) | 2021.10.08 |
---|---|
[백준] 1436 영화감독 숌 (Python 파이썬) (0) | 2021.10.02 |
[프로그래머스] 숫자의 표현(Python 파이썬) (0) | 2021.04.22 |
[백준] 2292 벌집 (Python 파이썬) (0) | 2021.04.12 |