프로그래머스-파이썬

메뉴 리뉴얼

daco 2022. 8. 31. 04:42

https://school.programmers.co.kr/learn/courses/30/lessons/72411

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


try1

orders에 존재하는 문자열들의 조합으로 딕셔너리를 만들어 풀고자 했음

 

※나의 코드 - 실패함

def solution(orders, course):
    answer = []
    from itertools import combinations
    from collections import defaultdict

    char = sorted(set(''.join(orders)))             # orders에 들어가 있는 문자들 추출

    for k in course:
        dic = defaultdict(int)
        menu = []
        menu += list(combinations(char, k))         # char에 대해 해당 course 값의 나올 수 있는 메뉴 만들기
        for name in menu:
            name = ''.join([n for n in name]) 
            for o in orders:
                if set(name).issubset(o):           # 나올 수 있는 메뉴가 order에 있다면 +1
                    dic[name] += 1

        for i, v in dic.items():                    # 2회 이상이고 가장 많이 시킨 조합 메뉴 찾기
            if v >= 2 and v == max(dic.values()):
                answer += [i]

    return sorted(answer)

문제 풀이)

orders에 들어가 있는 문자들을 list형태로 char에 넣음

 

course에 대해 for문이 돌 때,

1. 딕셔너리 기본값이 0인 dic을 만들고 char의 문자들로 나올 수 있는 모든 조합을 menu에 넣음

2. order에서 나올 수 있는 조합이라면 딕셔너리 값에 1을 더함

3. 2회 이상이고 가장 많이 시킨 조합이라면 answer에 추가

 

마지막 리턴할 때 오름차순으로 해줌

 

테스트 결과 - 실패(시간초과)

더보기
테스트 1 통과 (1.29ms, 10.3MB)
테스트 2 통과 (0.92ms, 10.1MB)
테스트 3 통과 (0.29ms, 10.2MB)
테스트 4 통과 (0.59ms, 10MB)
테스트 5 통과 (0.88ms, 10.2MB)
테스트 6 통과 (1.86ms, 10.1MB)
테스트 7 통과 (1.96ms, 10.2MB)
테스트 8 통과 (20.90ms, 10.3MB)
테스트 9 통과 (25.39ms, 10.3MB)
테스트 10 통과 (816.21ms, 16.2MB)
테스트 11 통과 (717.14ms, 15.1MB)
테스트 12 통과 (715.50ms, 16.6MB)
테스트 13 실패 (시간 초과)
테스트 14 실패 (시간 초과)
테스트 15 실패 (시간 초과)
테스트 16 통과 (18.72ms, 10.3MB)
테스트 17 통과 (157.14ms, 10.7MB)
테스트 18 통과 (87.65ms, 10.4MB)
테스트 19 통과 (0.77ms, 10MB)
테스트 20 통과 (9.32ms, 10MB)

※ 참고한 다른 사람 코드

# 다른 사람 코드

from itertools import combinations
from collections import Counter


def solution(orders, course):
    answer = []
    for c in course:
        temp = []
        for order in orders:
            combi = combinations(sorted(order), c)
            temp += combi
        counter = Counter(temp)
        print(counter)
        if len(counter) != 0 and max(counter.values()) != 1:
            answer += [''.join(f) for f in counter if counter[f] == max(counter.values())]

    return sorted(answer)

다른 사람 코드 해석)

course에 대해 for문이 돌 때,

1. orders에 대해 for문이 돌고, 각 order에 대해 나올 수 있는 조합들을 temp에 넣음
    이 때, sorted를 하는 이유는 이 후에 Counter로 중복된 조합을 셀 때 문자의 순서도 같아야 같은 것으로 세기 때문

2. 키가 조합, 값이 중복된 수인 딕셔너리 counter를 만듦

3. if문들의 조건에 맞는 조합을 answer에 추가

 

테스트 결과 - 총합 411.52ms

더보기
테스트 1 통과 (0.27ms, 10.2MB)
테스트 2 통과 (0.08ms, 10.1MB)
테스트 3 통과 (0.28ms, 10.2MB)
테스트 4 통과 (0.30ms, 10.2MB)
테스트 5 통과 (0.13ms, 10.2MB)
테스트 6 통과 (0.31ms, 10.3MB)
테스트 7 통과 (0.77ms, 10.1MB)
테스트 8 통과 (13.91ms, 10.4MB)
테스트 9 통과 (7.73ms, 10.5MB)
테스트 10 통과 (133.86ms, 10.5MB)
테스트 11 통과 (44.84ms, 10.3MB)
테스트 12 통과 (35.19ms, 10.1MB)
테스트 13 통과 (39.97ms, 10.6MB)
테스트 14 통과 (30.50ms, 10.4MB)
테스트 15 통과 (86.39ms, 10.3MB)
테스트 16 통과 (13.63ms, 10.4MB)
테스트 17 통과 (1.60ms, 10.2MB)
테스트 18 통과 (0.31ms, 10.3MB)
테스트 19 통과 (0.05ms, 10.1MB)
테스트 20 통과 (1.40ms, 10.4MB)