2021 KAKAO BLIND RECRUITMENT 메뉴리뉴얼 파이썬

1 분 소요

2021 KAKAO BLIND RECRUITMENT 메뉴리뉴얼 파이썬 풀이

바로 이전에 풀었던 괄호변환 문제와 동일한 2레벨 문제입니다.

하루종일 풀이법에 대해 고민하고 코드를 작성해봤지만, 해결하지 못하고 가장 간결한 모범답안을 참고했습니다. 해당 풀이는 개발하는 사막여우님의 블로그를 참고했습니다.

오답 코드(개인적인 풀이)

from itertools import combinations


def solution(orders, course):
    answer = []
    orders_sorted = []
    for i in orders:
        orders_sorted.append(''.join(sorted(i)))
    # print(orders_sorted)

    # 주문에 활용된 메뉴의 경우의 수
    menus = []
    for i in orders_sorted:
        for j in i:
            if j not in menus:
                menus.append(j)
    # print(menus)
    # 이 위치에 course 삽입
    menu_combi = list(combinations(menus, 2))
    menu_combi_li = []
    for item in menu_combi:
        menu_combi_li.append(''.join(sorted(item)))
    # print(menu_combi_li)
    for k in orders_sorted:
        for num in menu_combi_li:
            cnt = 0
            max_cnt = 2
            for j in num:
                if j not in k:
                    break
                else:
                    pass
                cnt += 1
                if cnt > max_cnt:
                    max_cnt = max(cnt, max_cnt)
                    if not answer:
                        answer.append(num)
                    else:
                        answer.pop()
                        answer.append(num)
                elif cnt == max_cnt:
                    answer.append(num)

    print(answer)
    return

정답 코드

from itertools import combinations
# Counter 모듈은 글자의 개수를 dictionary 형태로 저장해줍니다.
from collections import Counter


def solution(orders, course):
    answer = []
    for c in course:
        temp = []
        for order in orders:
          # 각각의 주문내역에 대해서 course에서 요구한 개수에 따른 조합을 구합니다
            combi = combinations(sorted(order), c)
          # 조합을 temp 리스트에 넣어줍니다.
            temp += combi
        # temp 리스트에 들어간 원소들에 대해서 개수를 구해줍니다.
        counter = Counter(temp)
        # 조합이 존재하지 않거나 한번밖에 주문이 되지 않는 경우는 제외합니다.
        if len(counter) != 0 and max(counter.values()) != 1:
          # max(counter.values())는 가장 많이 등장한 값을 가르킵니다.
            answer += [''.join(f) for f in counter if counter[f] == max(counter.values())]
    # 최종적으로 오름차순으로 정렬해서 출력합니다.
    return sorted(answer)

해당 문제의 모범 답안을 살펴보면, 조합을 구해주는 combinations 모듈과

문자열의 개수를 세어주는 Counter 모듈을 적절하게 활용했습니다.

이전에 combinations 모듈에 대해서는 알았지만 Counter 모듈의 존재도 몰랐고,

어떻게 활용할 수 있는지 이번 문제를 통해 배운 것 같습니다.

알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady

댓글남기기