Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 배열에서 n개 숫자의 최대 곱 구하기

첫 번째 인수로 숫자 배열을, 두 번째 인수로 정수 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이 각각 최대 곱이 됩니다. 음수 두 개를 곱하면 양수가 된다는 점을 활용해, 경우에 따라 절댓값이 큰 음수 쌍을 선택하는 것이 더 유리함을 확인할 수 있습니다.