문제

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

풀이

시도 1

각원소의 곱이 최대가 되기 위해서는 최대한 큰 시작값의 원소를 찾아야한다. s를 n으로 나누었을때 나머지는 생각하지 않고 몫을 answer 배열의 n개만큼 채워놓고 for문을 돌면서 원소의 합이 s와 같지 않으면 1씩 더하면 된다.

어차피 n > s 이므로 포문을 돌면서 1을 더하면 무조건 s의 값까지는 도달할 수 있다.

solution.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def solution(n, s):
    quotient, remainder = divmod(s, n)
    answer = [quotient] * n
    if n > s:
        return [-1]
    for i in range(len(answer)):
        if sum(answer) != s:
            answer[i] += 1
        else:
            return sorted(answer)

정확도 테스트는 전부 통과했지만 효율성 테스트에서 실패하여 75점

시도 2

나머지 값만큼만 합이 모잘랐기 때문에 포문은 나머지값만 돌면 되었다. 마지막에 리턴하지 sorted 하지 않고 배열의 끝부터 더하여 주었다.

solution.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def solution(n, s):
    if n > s:
        return [-1]
    quotient, remainder = divmod(s, n)
    answer = [quotient] * n

    for i in range(remainder):
        answer[-i -1] += 1

    return answer

다른사람풀이

수학적 풀이 방법

solution.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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