https://school.programmers.co.kr/learn/courses/30/lessons/12938
원소들의 합이 n인 중복 집합들 중에서 곱이 최대가 되기 위해서는, 집합 내 숫자들 간의 표준편차가 가장 적어야 한다는 것을 의미한다.
이게 받아들여지지 않는다면, 미적분에서도 극대값과 극솟값은 항상 값들이 고르게 분포되어있거나, 특수한 상황이라는 것을 잘 떠올려본다면 위의 말을 쉽게 납득 가능할 것이다.
따라서, 우선 원소들의 총합인 s를 원소의 갯수 n으로 나눈 몫값을 모든 원소에 할당한다. 그 다음 나머지를 하나씩 뿌려주면 된다. 예를 들어 합 11을 이루고 원소의 갯수가 3개인 최고의 집합을 찾는 방법은 다음과 같다. 우선 원소 3개에 모두 3씩 주고, 남은 2를 1씩 총 두 원소에게 할당해주면 된다.
[3,4,4]
단, 문제에서 오름차순으로 정렬하라고 했기 때문에, 나머지 값을 할당할때 뒤에 있는 원소들부터 1씩 더 주면 된다.
class Solution {
public int[] solution(int n, int s) {
int[] answer = new int[n];
if (n > s) return new int[] {-1};
int initValue = s / n;
int remain = s % n;
for(int i = 0; i<n; i++){
if (i >= n - remain) {
answer[i] = initValue + 1;
} else {
answer[i] = initValue;
}
}
return answer;
}
}
