최고의 집합에 해당하는 조건은 아래와 같다.
- 각 원소의 합이 S가 되는 자연수의 집합
- 위 조건을 만족하면서 각 원소의 곱 이 최대가 되는 집합
- 자연수는 중복 가능
1차 시도 - 최대한 유사한 값들을 곱하면 최대가 될 것이다.
동일한 값으로 먼저 나누고, 나머지를 +1씩 해 주도록 한다.
class Solution {
public int[] solution(int n, int s) {
LinkedList<Integer> answer = new LinkedList<Integer>();
if (s / n == 0) {
answer.add(-1);
} else {
answer.addAll(findSimilarElements(n, s));
}
return answer.stream().sorted().mapToInt(i -> i).toArray();
}
public LinkedList<Integer> findSimilarElements(int n, int s) {
LinkedList<Integer> list = new LinkedList<Integer>();
int quotient = s / n;
int remainder = s % n;
for (int i = 0; i < remainder; i++) {
list.add(quotient + 1);
}
for (int i = remainder; i < n; i++) {
list.add(quotient);
}
return list;
}
}
결과 - 시간초과
2차 시도 - sorting 부분을 지우자
1 <= n <= 10,000 이고 1 <= s <= 100,000,000이며 위의 경우는 sorting때문에 시간 복잡도가 O(NlogN)이었을 것이다.
아래와 같은 코드로 바꾼다면 O(N)만에 동작할 수 있다.
class Solution {
public int[] solution(int n, int s) {
LinkedList<Integer> answer = new LinkedList<Integer>();
if (s / n == 0) {
answer.add(-1);
} else {
answer.addAll(findSimilarElements(n, s));
}
return answer.stream().mapToInt(i -> i).toArray();
}
public LinkedList<Integer> findSimilarElements(int n, int s) {
LinkedList<Integer> list = new LinkedList<Integer>();
int quotient = s / n;
int remainder = s % n;
int quotientNumber = n - remainder;
for (int i = 0; i < quotientNumber; i++) {
list.add(quotient);
}
for (int i = quotientNumber; i < n; i++) {
list.add(quotient + 1);
}
return list;
}
}
결과는 마찬가지로 시간초과...
3차시도 - 아무래도 stream부분과 list를 addAll하는 곳 때문에 시간 초과가 난 것 같다.
어차피 원소의 개수는 n개로 일정하기 때문에 LinkedList를 array로 바꾸는 방식이 아니라 바로 array를 구하도록 하자
class Solution {
public int[] solution(int n, int s) {
if (s / n == 0) {
return new int[] { -1 };
}
return findSimilarElements(n, s);
}
public int[] findSimilarElements(int n, int s) {
int[] answer = new int[n];
int quotient = s / n;
int remainder = s % n;
int quotientNumber = n - remainder;
for (int i = 0; i < quotientNumber; i++) {
answer[i] = quotient;
}
for (int i = quotientNumber; i < n; i++) {
answer[i] = quotient + 1;
}
return answer;
}
}
'알고리즘 공부 > programmers' 카테고리의 다른 글
Programmers 64062: 징검다리 건너기 (0) | 2021.01.17 |
---|---|
Programmers 67259: 경주로 건설 (0) | 2021.01.05 |
Programmers 42898: 등굣길 (0) | 2021.01.05 |
Programmers 17685: 자동완성 (0) | 2020.12.30 |
Programmers 43236: 징검다리 (0) | 2020.12.26 |