(JS) 프로그래머 lv3. 최고의 문장

문제 설명

n개의 자연수로 이루어진 중복집합(다집합, 이하 편의상 집합으로 총칭함) 중에서 다음 두 가지 조건을 만족하는 집합을 최적집합이라 한다.

  1. 각 요소의 합이 S인 숫자 집합
  2. 위의 조건을 만족하면서 각 원소의 곱이 최대가 되는 집합

예를 들어, 2개의 자연수 집합에는 합이 9인 4개의 집합이 있습니다.
{1, 8}, {2, 7}, {3, 6}, {4, 5}
그 중 각 원소의 곱이 가장 큰 {4,5}가 가장 좋은 집합이다.

세트의 요소 수인 n과 모든 요소의 합인 s를 매개변수로 주어 최적의 세트를 반환하는 solve 함수를 완성합니다.

제한

  • 최고의 문장 오름차순으로 정렬된 1차원 배열(목록, 벡터) 로 돌아가주세요
  • 베스트 세트가 없을 때 크기가 1인 1차원 배열(목록, 벡터) 돌아가려면 -1을 입력합니다.
  • 자연수 n은 1에서 10,000 사이의 자연수이다.
  • 모든 요소의 합 s는 1보다 크거나 같고 100,000,000보다 작거나 같은 자연수입니다.

I/O 예시

N 에스 결과
2 9 (4, 5)
2 하나 (-하나)
2 8일 (4, 4)

I/O 예제 #1
문제의 예와 같습니다.

I/O 예제 #2
합이 1인 두 개의 자연수 집합을 만들 수 없습니다. 따라서 -1을 포함하는 배열을 반환합니다.

I/O 예제 #3
합이 8인 두 자연수의 집합은 다음과 같습니다.

{1, 7}, {2, 6}, {3, 4}, {4, 4}

그 중 각 원소의 곱이 가장 큰 { 4, 4 }가 가장 좋은 집합이다.

내 솔루션

function solution(n, s) {
    if(n>s) return (-1)
    let q=parseInt(s/n)
    let r=s%n
    let answer= Array(n).fill(q)

    while(r){
     answer(r)++
     r--
    }

    return answer.sort()
}

솔루션 전략

1. n의 개수와 관계없이 각 개수의 편차가 작아야 그 곱이 최대가 됩니다.

2. 곱이 가장 큰 수 중에서 가장 작은 수가 s/n의 몫

3. 응답 배열을 최대 n 배열까지 s/n의 몫으로 채웁니다.

4. 응답 배열에 한 번에 하나씩 추가하면서 나머지 s%n만큼 반복합니다. r의 나머지 수를 1씩 뺍니다.

5. 베스트 세트는 오름차순으로 정렬되므로 답변을 정렬하고 반환