문제 이해하기
양의 정수 다섯 개로 이루어진 배열이 주어졌을 때, 그중 정확히 네 개의 정수를 더하여 만들 수 있는 최솟값과 최댓값을 구하는 것이 이번 과제입니다.
결과는 최솟값과 최댓값을 공백으로 구분해 한 줄로 출력하거나, 배열 형태로 반환하면 됩니다. 입력 배열이 항상 정렬되어 있는 것은 아니라는 점에 유의해야 합니다.
예시
예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.
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)처럼 숫자 비교 함수를 함께 전달해야 합니다.