알고리즘/프로그래머스

2021 카카오 코딩테스트 기출- 메뉴 리뉴얼

그레고리력 2021. 1. 29. 21:58

- 카카오는 기출을 프로그래머스에 공개한다. 내 수준에서 레벨1은 쉽고 레벨 2는 구현은 가능하나 코드가 지저분하고, 레벨 3은 반반이다. 레벨 4부터는 확실히 어렵다. 코딩테스트 통과 기준은 정해져있지 않지만 통상 레벨 3까지는 무난하게 풀어야 한다고들 말한다. 릿코드 기준으로 medium 까지는 그냥 풀어야 하는 것. 

- 카카오 기출은 문제가 난이도와 관계없이 문제가 장황한 편이다. 논리력은 기본이나 회사생활에 필요한 독해력을 보려고 하는 것이 아닌지 추측해본다. 기획자의 주저리 주저리 요청사항에서 필요한 요소를 뽑아내는 능력을 보는 것이 아닐까? 

-일단 목표는 구현 및 통과가 첫번째, 나중에 다른사람들의 코드를 참고하거나 내 코드를 리팩토링 하도록 해보자. 

 

문제 - 생략

 

코드 - 파이썬 

def solution(orders, course):
    answer = []
    for j in range(len(course)) :
        dic = {}
        for i in range(len(orders)):
            arr = list(orders[i])
            arr.sort()
            menu(''.join(arr), course[j], '', dic)
        if not dic :
            continue
        maxval = max(dic.values())
        for key in dic :
            if dic[key] == maxval and maxval > 1:
                answer.append(key)
    return sorted(answer)

def menu(s, length, string, dic) :
    L = len(s)
    if length == 0 :
        if string in dic:
            dic[string] += 1
        else :
            dic[string] = 1
    if L < length or not s:
        return
    for i in range(L) :
        menu(s[i+1:], length -1, string + s[i], dic)

  

풀이

1. course 수 마다, 가능한 주문 조합을 dic에 저장하고 주문한 사람의 수가 1이상이며 가장 많이 주문한 조합을 answer에 저장한다. 

2. 이 때 중복을 피하고 문제의 조건에 따라 적절히 정렬을 해준다. 

 

개선 

1. 다른 풀이 보면 파이썬 라이브러리를 이용해서 깔끔하게 풀던데 일단은 생략. 

2. 변수 및 함수 이름이 너무 지저분, setdefault 등을 이용해서 깔끔하게 정리 가능할 듯 

3. sort가 너무 많고 리스트에서 문자열로 바꾸고 다시 바꾸고 하는 과정도 불필요, maxval 찾는 것도 비효율적

 

일단 시작이 반이니 차차 개선하는걸로!