문제풀이/프로그래머스

[프로그래머스][조합] - 메뉴 리뉴얼

얄루몬 2022. 8. 11. 20:10

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는 중복된 값으로 보며 하나만 넣음
  • 순열 - 순서가 의미가 있기에 모든 경우의 수를 뽑아 사용할 때 적합 (프로그래머스 피로도문제가 이 경우!)
  • 수열 - 수 또는 다른 대상이 순서 있는 나열의 경우를 수열이라 한다

 

느낀점

요즘 알고리즘 테스트에는.. 수열, 조합,, 문자열, 투포인터 등의 문제가 많은 것 같다.. 완전 탐색은 기본인듯..

이를 좀 더 보강하자!