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

JavaScript로 하나의 요소를 제외한 배열 합계의 최솟값과 최댓값 구하기

정수로 이루어진 다음과 같은 배열이 있다고 가정해 보겠습니다.

const arr = [12, 1, 4, 8, 5];

우리는 이러한 배열을 유일한 인수로 받아 처리하는 JavaScript 함수를 작성해야 합니다.

함수는 정확히 두 개의 정수를 담은 배열을 반환해야 하며, 각각의 의미는 다음과 같습니다.

  • 첫 번째 정수: 배열 요소 중 하나를 제외했을 때 가능한 가장 작은 합

  • 두 번째 정수: 배열 요소 중 하나를 제외했을 때 가능한 가장 큰 합

여기서 중요한 조건은 단 하나의 for 루프만 사용해서 문제를 해결해야 한다는 점입니다.

접근 방법

핵심 아이디어는 간단합니다. 배열의 모든 요소의 총합을 구한 뒤,

  • 총합에서 최댓값을 빼면 가장 작은 합이 되고,
  • 총합에서 최솟값을 빼면 가장 큰 합이 됩니다.

예를 들어 위 배열의 경우 출력 결과는 다음과 같습니다.

const output = [18, 29];

가장 작은 합 18은 최댓값인 12를 제외한 결과이고, 가장 큰 합 29는 최솟값인 1을 제외한 결과입니다.

예제 코드

const arr = [12, 1, 4, 8, 5];
const findExtremeNumbers = (arr = []) => {
   let sum = 0;
   let min = Infinity;
   let max = -Infinity;
   for(let i = 0; i < arr.length; i++){
      const curr = arr[i];
      sum += curr;
      if(curr > max){
         max = curr;
      }
      if(curr < min){
         min = curr;
    };
  };
  return [sum - max, sum - min];
};
console.log(findExtremeNumbers(arr));

동작 원리 설명

위 코드는 단 한 번의 순회로 세 가지 값을 동시에 계산합니다.

  1. sum: 모든 요소의 총합을 누적합니다.

  2. max: 지금까지 확인한 요소 중 가장 큰 값을 추적합니다. 초기값은 음의 무한대(-Infinity)입니다.

  3. min: 지금까지 확인한 요소 중 가장 작은 값을 추적합니다. 초기값은 양의 무한대(Infinity)입니다.

루프가 끝나면 sum - max(최댓값 제외 합)와 sum - min(최솟값 제외 합)를 배열 형태로 반환합니다. 이 방식은 시간 복잡도 O(n)으로, 단일 순회만으로 효율적으로 문제를 해결할 수 있습니다.

출력 결과

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

[18, 29]