본문 바로가기

알고리즘/프로그래머스

[Python] 최고의 집합

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

 

프로그래머스

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

programmers.co.kr

  • 첫 번째 풀이
from functools import reduce

def combinations_with_replacement(iterable, r):
    # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
    pool = tuple(iterable)
    n = len(pool)
    if not n and r:
        return
    indices = [0] * r
    yield list(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != n - 1:
                break
        else:
            return
        indices[i:] = [indices[i] + 1] * (r - i)
        yield list(pool[i] for i in indices)
        
def multiply(arr):
    return reduce(lambda x, y: x * y, arr) 

def solution(n, s):    
    if n > s:
        return [-1]
    
    comb = list(combinations_with_replacement(range(1, s+1), n))
    
    filtered_set = []
    for i in comb:
        if sum(i)==s:
            filtered_set.append(i)
    
    max_product = 0
    answer = []
    for i in filtered_set:
        product = multiply(i)
        if product > max_product:
            max_product = product
            answer = i
            
    return answer

Combination을 전부 구해서 합을 구하고 곱을 구하고.... 시간이 너무 오래걸림..

수학적으로 생각을 해야하는데 그저 문제만 풀어보겠다고 해서 오히려 비효율적으로 돼버림.

 

  • 다른 사람의 풀이
def bestSet(n, s):
    answer = []
    a = int(s/n)

    if a == 0:
        return [-1]

    b = s%n

    for i in range(n-b):
        answer.append(a)
    for i in range(b):
        answer.append(a+1)

    return answer

수학적으로 깔끔하게 푼 풀이가 있었음...

난 아직 멀었나..

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Python] 소수 찾기  (0) 2022.12.21
[Python] n^2 배열 자르기  (0) 2022.12.20
[Python] 기능 개발  (0) 2022.12.18
[Python] 이중 우선순위 큐  (0) 2022.12.09
[Python] 정수 삼각형  (0) 2022.12.08