from itertools import combinations
from collections import Counter
def solution(orders, course):
answer = []
for c in course:
tmp = []
for order in orders:
combi = combinations(sorted(order),c)
tmp += combi
cnt = Counter(tmp)
#해당 메뉴가 없거나 해당 메뉴를 1명만 주문한 것이 아니라면
if len(cnt) != 0 and max(cnt.values())!=1:
#해당 메뉴가 최대로 주문받은 경우에만 돌려줌
answer += [''.join(f) for f in cnt if cnt[f]==max(cnt.values())]
return sorted(answer)
- 조합을 사용한 문제(순서를 중요하게 생각하지 않는 조합은 중복되는 경우 1,2 == 2,1로 본다.)
- 몇개의 메뉴로 구성됨에 따라 개수를 의미하는 course를 돌며 진행한다.n개의 메뉴 중 c개를 뽑아 진행
- tmp라는 리스트를 하나 만들어 모든 조합을 넣어준다.
- tmp에 들어있는 조합을 Counter를 사용해서 몇개인지를 확인하고 해당 조합이 메뉴가 없거나 1개인 경우엔 answer에 넣지 않는다.
- answer에 최종적으로 들어가게 될 경우는 최대로 나온 메뉴만 넣어주게 된다.
조합과 순열
- 조합 - 순서가 의미 없기에 2,1 == 1,2는 중복된 값으로 보며 하나만 넣음
- 순열 - 순서가 의미가 있기에 모든 경우의 수를 뽑아 사용할 때 적합 (프로그래머스 피로도문제가 이 경우!)
- 수열 - 수 또는 다른 대상이 순서 있는 나열의 경우를 수열이라 한다
느낀점
요즘 알고리즘 테스트에는.. 수열, 조합,, 문자열, 투포인터 등의 문제가 많은 것 같다.. 완전 탐색은 기본인듯..
이를 좀 더 보강하자!
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 뒤에 있는 큰 수 찾기 (0) | 2023.04.04 |
---|---|
[프로그래머스] - 추억 점수(java) (0) | 2023.03.31 |
[프로그래머스] - 게임 맵 최단거리 (0) | 2022.08.09 |
[프로그래머스] - 문자열 다루기 기본 (0) | 2022.08.09 |
[프로그래머스] - 문자열 내 마음대로 정렬하기 (0) | 2022.08.09 |