IT/개발지식

[자바스크립트] 최대값과 최소값 찾기

김솔샤르 2018. 8. 19. 14:03

 

 

최대값과 최소값을 찾고자할 때 단순히 for문을 돌리는 방법이 있겠으나 이는 세련되지 못하다. 조금 더 자바스크립트스러운 방법을 알아보자.

 

 

 Math 객체 이용

 

기본 내장 객체인 Math 객체를 이용해보자. 이 객체는 절대값을 반환해주는 Math.abs, 난수를 발생시키는 Math.random 등 수학 기능과 관련된 다양한 메소드를 제공한다. 또한 Math.max, Math,min 메소드를 통해 최대값, 최소값을 구할 수 있다. 예제를 보자.

 

var numbers = [ 19, 1, 3, 37, 8 ];

Math.max.apply(null, numbers); // 37
Math.min.apply(null, numbers); // 1

 

갑자기 apply 메소드가 사용됐다. 짧게 설명하자면 apply 메소드는 자바스크립트의 모든 객체에 기본적으로 내장되어있는 메소드이다. 첫번째 인자로 this로 사용될 객체(예시에서는 null), 두번째 인자로 함수에 전달될 인수의 집합(예시에서는 numbers)을 넘겨준다. 

 

Math.max 메소드는 원래 인자로 두 숫자를 받아서 둘 중 큰 값을 반환하는데, apply 메소드를 사용하면 인자로 배열을 전달할 수 있게 되는 것이다.

 

이 Math.max, Math.min 메소드를 활용해도 대부분은 원하는 최대, 최소값을 구할 수 있다. 하지만 요소가 1000만개가 넘는 매우 큰 배열이 들어오는 경우 메모리 부족으로 인한 오류를 발생시킨다.

 

그럴때는 reduce 메소드를 활용할 수 있다.

 

 

 reduce 메소드 이용

 

다음과 같이 reduce 메소드를 활용한다면 Math 객체를 이용하지 않고도 최대, 최소값을 구할 수 있다.

 

var numbers = [ 19, 1, 3, 37, 8 ];

//최대값
var max = numbers.reduce( function (prev, cur) { 
    return prev > cur ? prev:cur;
});

//최소값
var min = numbers.reduce( function (prev, cur) { 
    return prev > cur ? cur:prev;
});
​

 

reduce 함수는 누산기의 개념을 활용하여 배열의 요소를 왼쪽에서 오른쪽으로 탐색하며 줄여나간다. 최종적으로는 단 하나의 요소만이 남게 된다. 값을 줄여나가는 기준은 reduce 메소드의 첫번째 인자인 콜백함수로 결정된다. 그리고 초기값은 두번째 인자에 세팅해줄 수 있는데 이는 생략 가능하다. 파라미터를 정리해보면 다음과 같다.

 

예제를 보면 콜백함수에서 다시 두 개의 인자 prev와 cur가 전달되었다. 본래 이 콜백함수는 4개의 인자를 취하지만 두개는 생략가능하다. 여기서 prev는 누적값이다. 콜백의 반환값을 계속해서 이 인자에 저장한다. 또한 cur은 현재 계산되고 있는 배열 요소이다.

 

설명을 종합하여 이제 다시 5라인을 보면 누적값 prev는 cur 이전의 배열 요소 중 최대값을 저장하고 있는데, 이를 cur과 비교하여 큰 값을 반환한다는 의미인 것이다. 이런식으로 간단히 최대, 최소값을 구할 수 있다.

 

reduce 메소드의 전체 인자를 정리해보면 다음과 같다.

 

  • callback
    배열의 각 (요소) 값에 대해 실행할 함수. 인자(argument) 4개를 취하며, 각 인자는 다음과 같다.
    • accumulator
      누산기(accumulator)는 콜백의 반환값을 누적합니다. 초기값(initialValue)이 주어진 경우에는 그 값(아래 참조) 또는 콜백의 마지막 호출에서 이전에 반환된 누적값입니다.
    • currentValue
      배열 내 현재 처리되고 있는 요소.
    • currentIndex(optional)
      배열 내 현재 처리되고 있는 요소의 인덱스. 초기값(initialValue)이 주어진 경우 0부터, 그렇지 않으면 1부터 시작한다.
    • array(optional)
      reduce()가 호출된 배열
  • initialValue(optional)
    콜백(callback)의 첫 번째 호출에서 첫 번째 인수로 사용되는 값. 초기값이 주어지지 않은 경우에는 배열의 첫 번째 요소가 사용된다. 빈(empty) 배열에서 초기값 없이 reduce()를 호출하면 에러가 발생한다.

 

 

- 끝 -



참고

 

https://msdn.microsoft.com/ko-kr/library/b272f386(v=vs.94).aspx

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

 

 

 

반응형