https://programmers.co.kr/learn/courses/30/lessons/72411
문제 핵심!!!
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://ourcstory.tistory.com/414
'알고리즘 > 프로그래머스문제풀이' 카테고리의 다른 글
[Python/프로그래머스]k진수에서 소수 개수 구하기 (0) | 2022.09.19 |
---|---|
[Python/프로그래머스]추석 트래픽 (0) | 2022.06.29 |
[Python/프로그래머스] 숫자 문자열과 영단어 (Level 1) (0) | 2022.06.29 |
[Python/프로그래머스]오픈채팅방 (0) | 2022.06.28 |
[Python/프로그래머스]문자열 압축 (0) | 2022.06.28 |