문제
풀이
문제를 보면 orders의 길이와 course의 길이가 매우 짧게 주어진다.
따라서 모든 경우의 수(조합)을 구하여 해결할 수 있는 문제이다.
단, 조합을 뽑은 후 반드시 정렬을 해서 딕셔너리에 넣어야 올바른 정답을 얻을 수 있다.
오늘 배운 것
딕셔너리 key값 탐색
if frequency[i] not in new_frequency.keys()
파이썬 딕셔너리에 값을 추가할 때 그동안은 위와 같이 key값들에 접근해서 이미 존재하는 키인지 확인해왔다.
if i not in new_frequency
그러나, in 키워드는 딕셔너리에서 기본적으로 키만 확인한다고 한다.
따라서 new_frequency.keys()로 작성하지 않고 new_frequency로 적어도 동일하게 코드가 작동한다.
위와 같이 작성하여 코드의 간결성을 키울 수 있다.
Counter 모듈
나는 아래 코드처럼 복잡하게 구현했지만, 파이썬의 Counter 모듈을 사용하면 좀 더 쉽게 풀 수 있다.
Counter는 리스트에 원소가 몇 번 나왔는지 직접 계산해주는 모듈이다.
또한 Counter의 most_common() 메서드를 통해 데이터의 개수가 많은 순으로 정렬된 배열을 얻을 수도 있다.
코드
from itertools import combinations
def solution(orders, course):
answer = []
frequency = {}
# 주문 별 조합 뽑기
for order in orders:
for i in course:
for j in list(combinations(list(order),i)):
j = list(j)
j.sort()
frequency_key = "".join(j)
if frequency_key not in frequency:
frequency[frequency_key] = 0
frequency[frequency_key] += 1
new_frequency = {}
# key = 코스 수, value = (주문된 횟수, 요리 알파벳)
for i in frequency:
if frequency[i] >= 2:
if len(i) not in new_frequency:
new_frequency[len(i)] = []
new_frequency[len(i)].append((frequency[i],i))
# 각 코스 별로 가장 많이 주문된 요리 뽑아 정답 배열에 넣기
for i in new_frequency:
array = sorted(new_frequency[i],reverse = True)
max_order_count = array[0][0]
for j in array:
if j[0] == max_order_count:
answer.append(j[1])
answer.sort()
return answer
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 파이썬 - 점찍기 (2) | 2024.10.03 |
---|---|
[프로그래머스] 파이썬 - 이모티콘 할인 행사 (2) | 2024.10.01 |
[프로그래머스] 340212 파이썬 - 퍼즐 게임 챌린지 (1) | 2024.09.24 |
[프로그래머스] 42890 파이썬 - 후보키 (0) | 2024.09.09 |
[프로그래머스] 12978 파이썬 - 배달 (0) | 2024.09.09 |