첫 번째 인수로 숫자 배열을, 두 번째 인수로 정수 n을 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 배열에서 n개의 숫자를 선택했을 때 만들 수 있는 가장 큰 곱을 계산하여 반환해야 합니다.
문제 해결 접근 방식
최대 곱을 구하려면 단순히 큰 숫자만 고르는 것으로는 부족하며, 음수의 활용 가능성까지 고려해야 합니다. 핵심 아이디어는 다음과 같습니다.
- 배열을 오름차순으로 정렬합니다.
- n이 홀수라면 가장 큰 요소 하나를 미리 곱에 포함시켜 남은 개수를 짝수로 맞춥니다.
- 이후 '절댓값이 큰 음수 두 개의 곱'과 '가장 큰 양수 두 개의 곱'을 비교하여, 더 큰 쪽의 쌍을 결과에 반영합니다.
- n이 배열의 길이보다 크거나, 모든 요소가 음수인 경우처럼 유효한 답을 만들 수 없다면 undefined를 반환합니다.
정렬된 배열의 앞쪽(음수 쌍)과 뒤쪽(양수 쌍)에서 각각 두 개씩 곱한 값을 비교해 나가는 방식으로 문제를 효율적으로 해결할 수 있습니다.
예제 코드
이를 구현한 코드는 다음과 같습니다 −
const getHighestProduct = (arr, num) => {
let prod = 1;
const sorter = (a, b) => a - b;
arr.sort(sorter);
if (num > arr.length || num & 2 && arr[arr.length - 1] < 0) {
return;
};
if (num % 2) {
prod = arr.pop();
num--;
};
while (num) {
prod *= arr[0] * arr[1] > arr[arr.length - 2] * arr[arr.length - 1]
? arr.shift() * arr.shift() : arr.pop() * arr.pop();
num -= 2;
};
return prod;
}
console.log(getHighestProduct([1, 10, -5, 1, -100], 3));
console.log(getHighestProduct([3, 4, 5, 6, 7], 3));
console.log(getHighestProduct([3, 4, -5, -6, -7], 3));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
5000 210 168
첫 번째 예제에서는 (-100) × (-5) × 10 = 5000이, 두 번째 예제에서는 5 × 6 × 7 = 210이, 세 번째 예제에서는 (-7) × (-6) × 4 = 168이 각각 최대 곱이 됩니다. 음수 두 개를 곱하면 양수가 된다는 점을 활용해, 경우에 따라 절댓값이 큰 음수 쌍을 선택하는 것이 더 유리함을 확인할 수 있습니다.