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

JavaScript로 음수 없이 배열에서 값 균등하게 빼는 방법

정수 배열이 있고, 이 배열 요소들의 합에서 특정 값을 빼야 하는 상황을 생각해 보겠습니다.

예를 들어 다음과 같습니다.

[4, 5, 6, 7, 8] − 25

모든 숫자에서 균등하게 값을 빼면 아래와 같은 결과가 나옵니다.

[−1, 0, 1, 2, 3]

하지만 우리는 0보다 작은 숫자가 결과에 포함되는 것을 원하지 않습니다.

따라서 이 문제를 해결하는 알고리즘을 작성한다면, 음수가 된 만큼의 값은 남아 있는 양수들에게 균등하게 분배되어야 합니다. 그러면 상태는 다음과 같이 변합니다.

[0, 0, 1, 2, 3] − 1

그리고 최종 결과는 다음과 같습니다.

[0, 0, 1 − 0.333, 2 − 0.333, 3 − 0.333]

여기서 주목할 점은, 이것이 바로 우리가 원하는 결과라는 것입니다.

음수가 된 모든 값들이 남은 양수 값들에 고르게 넘어가(오버플로우) 처리됩니다.

문제 요구 사항

우리는 JavaScript 함수를 작성해야 하며, 이 함수는 다음과 같은 조건을 충족해야 합니다.

  • 첫 번째 인자로 숫자 배열을 받습니다.
  • 두 번째 인자로 뺄 총합(숫자)을 받습니다.
  • 균등하게 뺄셈하고 분배된 새로운 배열을 계산하여 반환합니다.

알고리즘의 핵심 아이디어

이 알고리즘은 다음 단계로 동작합니다.

  1. 배열을 순회하면서, 현재 위치부터 끝까지 남은 요소의 개수(rem)를 구합니다.
  2. 남은 총합(sum)을 남은 요소 개수로 나눠 평균(avg)을 계산합니다.
  3. 실제로 뺄 값(toSubtract)은 평균과 현재 요소 값 중 더 작은 값입니다. 이렇게 하면 어떤 요소도 음수가 되지 않습니다.
  4. 뺀 만큼 총합에서 차감하고, el - toSubtract를 결과 배열에 담습니다.

구현 예제

이를 코드로 구현하면 다음과 같습니다.

const arr = [4, 5, 6, 7, 8];
const subtract = (arr, sum) => {
    return arr.map((el, index, array) => {
        const rem = array.length − index;
        const avg = sum / rem;
        const toSubtract = Math.min(avg, el);
        sum −= toSubtract;
        return el − toSubtract;
    });
};
console.log(subtract(arr, 25));

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[ 0, 0, 0.666666666666667, 1.666666666666666, 2.666666666666666 ]

결과를 보면 앞의 두 요소는 정확히 0이 되었고, 음수로 빠졌던 값만큼이 뒤의 세 요소에서 균등하게 차감된 것을 확인할 수 있습니다. 이처럼 Math.min()을 활용해 각 단계에서 뺄 수 있는 최대치를 제한하는 것이 이 알고리즘의 핵심입니다.