프로그래머스(카카오)-level2_메뉴 리뉴얼(Python)

이현우·2022년 8월 11일
0

문제 출처

2021 KAKAO BLIND RECRUITMENT 문제
https://school.programmers.co.kr/learn/courses/30/lessons/72411

문제 설명

문제

입출력 예

입출력 예에대한 설명

풀이1

def com(idx, sidx, N, R, arr, sel):
    global menu
    if sidx == R:
        temp = ""
        for i in sel:
            temp += i
        if temp not in menu:
            menu[temp] = 1
        else:
            menu[temp] += 1
        return
    # 해당자리를 뽑고 가고
    for i in range(idx, N):
        sel[sidx] = arr[i]
        com(i+1, sidx+1, N, R, arr, sel)

def solution(orders, course):
    answer = []
    global menu
    menu = {}
    for i in course:
        for j in orders:
            if len(j) < i:
                continue
            sel = [0] * i
            com(0, 0, len(j), i, sorted(j), sel)
        if len(menu) != 0 and max(menu.values()) != 1:
            for key, val in menu.items():
                if val == max(menu.values()):
                    answer.append(key)
        menu = {}
    return sorted(answer)

풀이 2

from itertools import combinations
from collections import Counter, defaultdict

def solution(orders, course):
    answer = []
    comb_dict = defaultdict(list)
    for order in orders:
        order =sorted(order)
        for num in course:
            if len(order) < num:
                break
            comb = list(map(lambda x: "".join(x), combinations(order, num)))
            comb_dict[num].extend(comb)
    for num, count_list in comb_dict.items():
        menu_count = Counter(count_list)
        max_count = max(menu_count.values())
        if max_count > 1:
            for menu, count in menu_count.items():
                if count ==max_count:
                    answer.append(menu)
    answer.sort()
    return answer

풀이 3

from collections import defaultdict, Counter
from itertools import combinations

def solution(orders, course):
    answer = []
    combi_dict = defaultdict(list)
    for num in course:
        temp = []   # 코스의 요리갯수에 따라 담을 빈 리스트
        for order in orders:
            combi = combinations(sorted(order), num)    # 요리갯수에 따른 조합 추출
            temp += combi   # 리스트에 추가
        counter = Counter(temp) # 코스의 카운트 딕셔너리 생성 {'menu': count, ...}
        # counter가 존재하고(길이를 벗어나는 경우 빈 딕셔너리가 생성됨)
        # counter의 최대 카운트 값이 1초과인 경우
        if len(counter) != 0 and max(counter.values()) > 1:
            # counter안의 메뉴들 중 카운트가 최대 값인 메뉴들만 asnwer에 추가
            answer += ([''.join(menu) for menu in counter if counter[menu] == max(counter.values())])
    answer.sort()
    return answer

테스트 실행 코드

if __name__ == '__main__':
	print(solution(["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"], [2,3,4])
    print(solution(["ABCDE", "AB", "CD", "ADE", "XYZ", "XYZ", "ACD"], [2,3,4])
    print(solution(["XYZ", "XWY", "WXA"], [2,3,4])
profile
GitHub - https://github.com/jenu8628

0개의 댓글