[CodeTest] 프로그래머스 Lv2 - 메뉴 리뉴얼

그냥·2022년 8월 25일
0

codetest

목록 보기
8/9

문제

메뉴 리뉴얼



조건 정리

1) 문자열로 이루어진 배열 orders와 정수로 이루어진 배열 course를 인자로 받는다.
2) 문자열로 이루어진 배열을 반환한다.
3) course에 있는 숫자에 따라 조합할 문자열의 길이가 달라진다.예를 들어 course 있는 숫자가 2면 문자열의 길이가 2가 되도록 문자를 조합한다.
4) 조합된 문자열 중 반환할 문자열은 만들어진 문자열 중 그 갯수가 가장 많은 문자열이다. 만약 갯수가 가장 많은 문자열이 여러 개면 여러 개 모두를 반환한다.
5) 반환하는 문자열과 원소는 문자열 순서에 맞게 정렬해서 반환한다.



풀이

풀이

1) orders 내에 있는 문자열에서 course의 숫자에 맞춰 문자열을 조합해야 한다. 예를 들어 "ABCFG"에서 길이가 2인 문자열을 뽑아야 한다는 것이다. 이는 순서에 상관없이 5개의 문자열에서 2개를 뽑아 조합하는 것이므로 순열, 조합 중 순열(combinations)를 사용한다.

2) Counter 메서드를 사용해서 combinations으로 만들어진 문자열의 갯수를 찾는다. Counter.most_common()은 데이터의 개수가 많은 순으로 정렬된 배열을 리턴한다.

from collections import Counter

Counter('hello world').most_common()

> [('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]

3) 가장 많은 갯수가 몇인지 찾고, 찾은 값이 2이상이면 그 갯수에 해당하는 문자열을 answer에 추가한다.


코드

from collections import Counter
from itertools import combinations

def solution(orders, course):
    answer = []
    for c in course:
        comb = []
        for order in orders:
            for com in combinations(order, c):
                comb.append(''.join(sorted(com)))
                
        counter = Counter(comb).most_common()

        print(counter)
        
        max_num = 0
        
        for c in counter:
            if c[1] >= max_num:
                max_num = c[1]
            
        for c in counter:
            if c[1] >= max_num and c[1] != 1:
                answer.append(c[0])
    
    return sorted(answer)

0개의 댓글