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

JavaScript에서 5개 정수 중 정확히 4개를 더해 만들 수 있는 최솟값과 최댓값 구하기

문제 이해하기

양의 정수 다섯 개로 이루어진 배열이 주어졌을 때, 그중 정확히 네 개의 정수를 더하여 만들 수 있는 최솟값과 최댓값을 구하는 것이 이번 과제입니다.

결과는 최솟값과 최댓값을 공백으로 구분해 한 줄로 출력하거나, 배열 형태로 반환하면 됩니다. 입력 배열이 항상 정렬되어 있는 것은 아니라는 점에 유의해야 합니다.

예시

예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.

const arr = [1, 3, 5, 7, 9]

네 개의 수를 더한 최소 합은 다음과 같습니다.

1 + 3 + 5 + 7 = 16

반면 최대 합은 다음과 같습니다.

3 + 5 + 7 + 9 = 24

따라서 함수의 반환값은 아래와 같아야 합니다.

[16, 24]

정렬을 활용한 구현

가장 직관적인 접근 방식은 배열을 오름차순으로 정렬한 뒤, 마지막(가장 큰) 요소를 제외하고 더하면 최소 합이 되고, 첫 번째(가장 작은) 요소를 제외하고 더하면 최대 합이 된다는 점을 활용하는 것입니다.

const arr = [1, 3, 5, 7, 9];

const findMinMaxSum = (arr = []) => {
  // 숫자 크기순으로 올바르게 정렬하기 위해 비교 함수를 전달
  const numbers = arr.slice().sort((a, b) => a - b);

  let minScore = 0;
  let maxScore = 0;

  // 가장 큰 값(마지막 요소)을 제외한 4개의 합 → 최소 합
  for (let i = 0; i < numbers.length - 1; i++) {
    minScore += numbers[i];
  }

  // 가장 작은 값(첫 번째 요소)을 제외한 4개의 합 → 최대 합
  for (let j = 1; j < numbers.length; j++) {
    maxScore += numbers[j];
  }

  return [minScore, maxScore];
};

console.log(findMinMaxSum(arr));

실행 결과

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

[16, 24]

더 간단한 대안: 전체 합 활용하기

반복문 두 개를 사용하는 대신, 다섯 개 숫자의 전체 합을 먼저 구한 뒤 최댓값을 빼면 최소 합이 되고, 최솟값을 빼면 최대 합이 됩니다. 이 방법은 코드도 짧고 가독성도 뛰어납니다.

const findMinMaxSum = (arr = []) => {
  const total = arr.reduce((acc, cur) => acc + cur, 0);
  const min = Math.min(...arr);
  const max = Math.max(...arr);

  return [total - max, total - min];
};

console.log(findMinMaxSum([1, 3, 5, 7, 9])); // [16, 24]

주의할 점

JavaScript의 Array.prototype.sort()는 기본적으로 요소를 문자열로 변환해 정렬합니다. 예를 들어 [10, 9, 100]을 인자 없이 정렬하면 [10, 100, 9] 순서가 되어 의도와 다른 결과가 나옵니다. 따라서 숫자 배열을 정렬할 때는 반드시 sort((a, b) => a - b)처럼 숫자 비교 함수를 함께 전달해야 합니다.