완전히 무작위로 섞여 있는 숫자 배열이 주어졌을 때, 이 배열을 정렬하지 않고 그 안에서 가장 큰 숫자와 가장 작은 숫자의 차이를 반환하는 함수를 작성해야 합니다.
배열을 오름차순으로 정렬한 뒤 첫 번째 요소와 마지막 요소를 빼는 방법도 있지만, 정렬은 일반적으로 O(n log n)의 시간 복잡도를 가지므로 효율적이지 않습니다. 대신 배열을 단 한 번만 순회하면서 최댓값과 최솟값을 동시에 추적하면 O(n)의 시간 복잡도로 문제를 해결할 수 있습니다.
reduce() 메서드를 활용한 해결 방법
JavaScript의 Array.prototype.reduce() 메서드를 사용하면 배열을 한 번의 순회만으로 최댓값과 최솟값을 모두 구할 수 있습니다. 누산기(accumulator)의 초기값을 { max: -Infinity, min: Infinity }로 설정하고, 각 요소를 순회하면서 현재 값이 기존 최댓값보다 크거나 기존 최솟값보다 작으면 값을 갱신합니다. 순회가 끝나면 최댓값에서 최솟값을 뺀 결과를 반환하면 됩니다.
예제 코드
const arr = [23, 65, 67, 23, 2, 6, 87, 23, 45, 65, 3, 234, 3];
const findDifference = arr => {
if(!arr.length){
return 0;
}
const creds = arr.reduce((acc, val) => {
let { max, min } = acc;
if(val > max){
max = val;
};
if(val < min){
min = val;
};
return { max, min };
}, {
max: -Infinity,
min: Infinity
});
return creds.max - creds.min;
};
console.log(findDifference(arr));
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
232
예제 배열에서 가장 큰 숫자는 234, 가장 작은 숫자는 2이므로 두 값의 차이인 232가 출력됩니다. 또한 이 함수는 빈 배열이 전달될 경우 별도의 에러 처리 없이 0을 반환하도록 작성되어 있어, 예외 상황에서도 안전하게 동작합니다.