본문 바로가기

알고리즘

프로그래머스) 메뉴 리뉴얼-python

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

 

프로그래머스

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

programmers.co.kr

 

from itertools import combinations

def solution(orders, course):
    answer = []
    
    dic = {}

    for i in range(len(orders)):
        for j in range(len(course)):
            if len(orders[i]) >= course[j]:
                arr = list(orders[i])
                for k in combinations(arr,course[j]):
                    a = tuple(sorted(k, key=lambda x: x))
                    if a in dic:
                        dic[a] += 1
                    else:
                        dic[a] = 1
    
    # print(dic)
    for i in range(len(course)):
        l = [ key for key in dic if len(key) == course[i] and dic[key] >= 2] 
        if l:
            
            maxi = [l[0]]
        
            for j in range(1,len(l)):
                if dic[maxi[-1]] < dic[l[j]]:
                    maxi = []
                    maxi.append(l[j])
                elif dic[maxi[-1]] == dic[l[j]]:
                    maxi.append(l[j])
            for c in maxi:
                s = ''.join(k for k in c)
                answer.append(s)
            
                
        
    answer.sort()
    return answer

솔직히

문제 이해만 5분,

풀이법 구상에만 5분

풀이에 1시간 반 정도.

총 1시간 40-50분 정도가 걸렸다.

개인적인 난이도는 구현하기가 어려운 탓에 중-상 정도로 생각한다.

 

코드는

우선 course에서 요구한 수 대로 조합해 dic 딕셔너리에 넣고 그 개수를 구한다.

다음으로 course에서 요구한 수만큼 최대값을 구한 후 answer에 append 시키면 된다.

 

말은 몇줄 안되지만 이를 구현하는데 많은 애를 먹었다.

 

쓸데없이 코드가 길고 중복된 반복문이 있기에 다 풀고 난 이후, 다른 사람들의 풀이를 참조했는데,

 

import collections
import itertools

def solution(orders, course):
    result = []

    for course_size in course:
        order_combinations = []
        for order in orders:
            order_combinations += itertools.combinations(sorted(order), course_size)

        most_ordered = collections.Counter(order_combinations).most_common()
        result += [ k for k, v in most_ordered if v > 1 and v == most_ordered[0][1] ]

    return [ ''.join(v) for v in sorted(result) ]

혹은, 

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)
        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)

이 풀이법이 가장 많았다.

두 풀이법 모두 Counter 모듈로 나처럼 하나씩 개수를 구하지 않아도 되었다.

또한 most_common()이란 모듈로 인해 최대값을 나처럼 구하지 않아도 되었기에 많은 도움이 되었다.