https://school.programmers.co.kr/learn/courses/30/lessons/12938
자연수 n 개로 이루어진 중복 집합(multi set, 편의상 이후에는 "집합"으로 통칭) 중에 다음 두 조건을 만족하는 집합을 최고의 집합이라고 합니다.
예를 들어서 자연수 2개로 이루어진 집합 중 합이 9가 되는 집합은 다음과 같이 4개가 있습니다.
{ 1, 8 }, { 2, 7 }, { 3, 6 }, { 4, 5 }
그중 각 원소의 곱이 최대인 { 4, 5 }가 최고의 집합입니다.
집합의 원소의 개수 n과 모든 원소들의 합 s가 매개변수로 주어질 때, 최고의 집합을 return 하는 solution 함수를 완성해주세요.

문제의 예시와 같습니다.
자연수 2개를 가지고는 합이 1인 집합을 만들 수 없습니다. 따라서 -1이 들어있는 배열을 반환합니다.
자연수 2개로 이루어진 집합 중 원소의 합이 8인 집합은 다음과 같습니다.
{ 1, 7 }, { 2, 6 }, { 3, 5 }, { 4, 4 }
그중 각 원소의 곱이 최대인 { 4, 4 }가 최고의 집합입니다.
원소들의 곱이 제일 커야 한다면, 하나의 숫자만 커서는 안된다.
골고루 비슷한 크기의 숫자가 되어야 곱이 제일 커진다.
만약 s=8, n=3인 경우에는 (1,1,6) = 6 보다는 (2,3,3) = 18 이 답에 더 가까워지는 것을 알 수 있다.
따라서 남은 배열 칸만큼 S를 나눠주는 s를 n으로 나눈 몫의 값(s/n)을 앞에서부터 넣어주면 오름차순의 배열로 만들어줄 수 있다.
s/n = 8/3 = 2 (s=s-2, n=n-1)
s/n = 6/2 = 3 (s=s-3, n=n-1)
s/n = 3/1 = 3 (s=s-3, n=n-1)
=> [2,3,3]
class Solution {
public int[] solution(int n, int s) {
int[] answer = new int[n]; //n개의 원소에 넣어야 하기 때문에 n개로 고정
if (s<n) return new int[]{-1}; //만약 s<n이라면 원소를 다 넣을 수 없기에 -1
int index=0; //배열 인덱스
while (n>0){ //만약 n이 0보다 크다면 배열 자리가 남았다는 뜻
int amount = s/n; //S를 남은 배열 크기 만큼 나눈 것이 가중치가 된다.
answer[index++] = amount; //앞부터 가중치를 넣는다.
s-=amount; //넣은 만큼 S를 줄여주고
n--; //남은 배열의 크기를 줄여준다.
}
return answer;
}
}