[java] 프로그래머스 - 최고의 집합
업데이트:
문제
프로그래머스-최고의 집합
자연수 n개로 이루어진 집합 중 합이 s개가 될 때, 각 원소의 곱이 최대인 집합을 구하는 문제
-
제한 사항
최고의 집합은 오름차순으로 정렬된 1차원 배열
최고의 집합이 존재하지 않는 경우, 크기가 1이며 -1이 채워진 배열을 리턴
자연수의 개수 n : 1 <=n
<= 10,000
모든 원소들의 합 s : 1 <=s
<= 100,000,000 -
예시
n = 2, s = 9 일때 가능한 집합은 다음과 같다
{ 1, 8 }, { 2, 7 }, { 3, 6 }, { 4, 5 }
이 때 원소의 곱이 가장 큰 경우는 { 4, 5 }이다
풀이
우선 합 s가 n보다 작은경우, 불가능하다
s = 3, n = 5일때 가장 작은 자연수인 1을 n번 더해도 s가 되지 않기 때문이다
우선 n개의 원소의 갯수 합이 s가되면서, 곱이 최대가 나와야 하므로
최대를 만족하는 원소의 갯수는 n개다
n개의 곱이 최대가 나오려면 각 n이 숫자가 균등하게 커야하는데
s % n == 0 이면 s / n
을 n만큼 채워준다
s % n != 0이면 그 나머지만큼 s/n + 1을 해준다
이 때, 정답의 뒤에서부터 추가해야한다
(오름차순 조건이 있기 때문)
소스코드
import java.util.*;
class Solution {
static int[] answer;
public int[] solution(int n, int s) {
if (s < n) {
answer = new int[1];
answer[0] = -1;
return answer;
}
answer = new int[n];
if (s % n == 0) {
for (int i = 0; i < answer.length; i++) {
answer[i] = s / n;
}
} else {
int m = s / n;
int last = s % n;
for (int i = answer.length - 1; i > -1; i--) {
if (last > 0) {
answer[i] = m + 1;
last--;
} else {
answer[i] = m;
}
}
}
return answer;
}
}
댓글남기기