JavaScript/배열

[JavaScript]배열에서 최댓값(max), 최솟값(min) 구하기

DevStory 2021. 8. 13.

JavaScript에서 배열최댓값(max), 최솟값(min)을 구하는 방법을 정리합니다.

 

배열에서 최댓값, 최솟값을 구하는 방법은 반복문을 사용하여 구할 수 있으며, 숫자인 경우에는 JavaScript에서 지원하는 Math.max()Math.min()을 사용하여 구할 수 있습니다.

 

단, Math.max()Math.min() 함수는 숫자만 가능하기에 제한적입니다.

 

문자열의 최댓값, 최솟값을 구하고 싶다면, 배열의 프로퍼티 함수인 reduce 함수를 사용하거나 또는 sort 함수를 사용하여 정렬 후 첫 번째 인덱스와 마지막 인덱스의 값을 구하는 방법도 존재합니다.

 


반복문을 사용하여 최댓값, 최솟값 구하기

Infinity는 무한대를 의미하는 특별한 숫자입니다.

첫 번째 인덱스 값으로 초기화해도 되지만, 배열의 요소가 존재하지 않는 경우를 생각하여 Infinity를 사용했습니다.

function arrayMin(arr) {
  // 배열의 요소가 무조건 존재할 경우 min = arr[0]로 변경 가능
  var len = arr.length, min = Infinity;
  while (len--) {
    if (arr[len] < min) {
      min = arr[len];
    }
  }
  return min;
};

function arrayMax(arr) {
  // 배열의 요소가 무조건 존재할 경우 max = arr[0]로 변경 가능
  var len = arr.length, max = -Infinity;
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
};

var array = [5, 3, 8, 10, 4, 0];

console.log('최댓값 : ' + arrayMax(array));
// 최댓값 : 10

console.log('최솟값 : ' + arrayMin(array));
// 최솟값 : 0

 

Infinity가 아닌 배열의 첫 번째 인덱스 값으로 변수 maxmin을 초기화하면, 문자열의 최댓값, 최솟값을 구할 수 있습니다.

빈 배열이 전달될 경우 undefined를 반환한다는 점 주의하여 코딩합니다.

function arrayMin(arr) {
  var len = arr.length, min = arr[0];
  while (len--) {
    if (arr[len] < min) {
      min = arr[len];
    }
  }
  return min;
};

function arrayMax(arr) {
  var len = arr.length, max = arr[0];
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
};

var array = ['AA', 'ZB', 'Z', 'A', 'C'];

console.log('최댓값 : ' + arrayMax(array));
// 최댓값 : ZB

console.log('최솟값 : ' + arrayMin(array));
// 최솟값 : A
반응형

Math.max와 Math.min 함수 사용하여 최댓값, 최솟값 구하기

Math.maxMath.min은 주어진 값 중에서 최댓값과 최솟값을 구합니다.

var maxValue = Math.max(5, 4, 3, 2, 1);
var minValue = Math.min(5, 4, 3, 2, 1);

console.log(`maxValue : ${maxValue}`);
// maxValue : 5

console.log(`minValue : ${minValue}`);
// minValue : 1

 

배열을 전달하면, NaN이 출력됩니다.

var maxValue = Math.max([5, 4, 3, 2, 1]);
var minValue = Math.min([5, 4, 3, 2, 1]);

console.log(`maxValue : ${maxValue}`);
// maxValue : NaN

console.log(`minValue : ${minValue}`);
// minValue : NaN

 

spread( ... ) 연산자를 사용하여 배열의 요소들을 분해하면 NaN이 출력되지 않습니다.

var arr = [5, 4, 3, 2, 1];

var maxValue = Math.max(...arr);
var minValue = Math.min(...arr);

console.log(`maxValue : ${maxValue}`);
// maxValue : 5

console.log(`minValue : ${minValue}`);
// minValue : 1

 

만약, ECMAScript 6 이전일 경우 spread( ... ) 연산자를 지원하지 않으므로 apply 함수를 사용합니다.

첫 번째 매개변수는 null

두 번째 매개변수는 배열을 전달합니다.

var arr = [5, 4, 3, 2, 1];

var maxValue = Math.max.apply(null, arr);
var minValue = Math.min.apply(null, arr);

console.log(`maxValue : ${maxValue}`);
// maxValue : 5

console.log(`minValue : ${minValue}`);
// minValue : 1

 

Math.max 함수와 Math.min 함수는 반복문에 비해 코드는 간단하지만, 배열의 요소가 많을 경우 에러가 발생합니다.

배열의 요소가 많지 않은 경우 사용해야 합니다.


reduce 함수를 사용하여 최댓값, 최솟값 구하기

function maxValue(arr) {
  return arr.reduce((max, val) => max > val ? max : val)
}

function minValue(arr) {
  return arr.reduce((min, val) => min < val ? min : val)
}

var arr = [1, 2, 3, 4, 5];

console.log(`maxValue : ${maxValue(arr)}`);
// maxValue : 5

console.log(`minValue : ${minValue(arr)}`);
// minValue : 1

 

reduce 함수를 사용하면, 문자열의 최댓값, 최솟값을 구할 수 있습니다.

function maxValue(arr) {
  return arr.reduce((max, val) => max > val ? max : val)
}

function minValue(arr) {
  return arr.reduce((min, val) => min < val ? min : val)
}

var arr = ['AA', 'ZB', 'Z', 'A', 'C'];

console.log(`maxValue : ${maxValue(arr)}`);
// maxValue : ZB

console.log(`minValue : ${minValue(arr)}`);
// minValue : A

sort 함수를 사용하여 정렬 후 최댓값, 최솟값 구하기

sort 함수를 사용하여 정렬 후 최댓값, 최솟값을 구할 수 있습니다.

단점으로는 원래 배열이 정렬 됩니다.

 

내림차순으로 정렬하면 첫 번째 인덱스의 값이 최솟값이며, 마지막 인덱스의 값이 최댓값입니다.

오름차순으로 정렬하면 첫 번째 인덱스의 값이 최댓값이며, 마지막 인덱스의 값이 최솟값입니다.

var arr = [5, 1, 3, 4, 2];

var maxValue = arr.sort((a, b) => b - a)[0];
var minValue = arr.sort((a, b) => a - b)[0];

console.log(`최댓값 : ${maxValue}`);
// 최댓값 : 5

console.log(`최솟값 : ${minValue}`);
// 최솟값 : 1

console.log(arr);
//  [1, 2, 3, 4, 5]

무슨 방식을 사용하는 것이 좋을까?

sort 함수를 사용하여 정렬 후 최댓값, 최솟값을 구하는 경우의 문제점은 원래 배열을 정렬한다는 점입니다.

원래 배열을 정렬을 해야 한다는 전제가 있을 경우 사용해야 합니다.

 

reduce 함수는 최댓값과 최솟값을 구하기 위한 용도가 아닙니다.

그래서 다른 방법에 비해 성능이 가장 안 좋습니다.

 

반복문을 사용하는 방법과 Math.max 함수와 Math.min 함수를 사용하는 방법이 가장 좋으며, 두 방법의 성능은 비슷합니다.

단, Math.max 함수와 Math.min 함수는 배열의 요소가 많을 경우 에러가 발생합니다.

 

정리하자면, 문자열의 최댓값, 최솟값을 구하는 경우 반복문을 사용하는 것을 권장합니다.

숫자의 최댓값, 최솟값을 구하는 경우 Math.max 함수와 Math.min 함수를 사용하는 것을 권장하나 배열의 요소가 대략 100만 개를 넘어갈 경우 반복문을 사용하는 것을 권장합니다.

 

반응형

댓글