문제 설명
n개의 자연수로 이루어진 중복집합(다집합, 이하 편의상 집합으로 총칭함) 중에서 다음 두 가지 조건을 만족하는 집합을 최적집합이라 한다.
- 각 요소의 합이 S인 숫자 집합
- 위의 조건을 만족하면서 각 원소의 곱이 최대가 되는 집합
예를 들어, 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. 베스트 세트는 오름차순으로 정렬되므로 답변을 정렬하고 반환
