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

JavaScript 배열에서 특정 숫자 기준 위·아래 요소 개수 구하기

다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.

const array = [54, 54, 65, 73, 43, 78, 54, 54, 76, 3, 23, 78];

문제 정의

배열에서 주어진 숫자를 기준으로, 그보다 작은 요소가 몇 개이고 크거나 같은 요소가 몇 개인지 세는 함수를 작성해야 합니다.

예를 들어 기준 숫자가 60이라면 결과는 다음과 같습니다.

  • 60보다 작은 요소: 54, 54, 43, 54, 54, 3, 23 → 총 7개
  • 60 이상인 요소: 65, 73, 78, 76, 78 → 총 5개

reduce()를 활용한 해결 방법

배열의 reduce() 메서드를 사용하면 배열을 한 번만 순회하면서 두 개의 카운트를 동시에 누적할 수 있습니다.

const array = [54, 54, 65, 73, 43, 78, 54, 54, 76, 3, 23, 78];

const countElements = (arr, num) => {
   return arr.reduce((acc, val) => {
      const key = val < num ? 'below' : 'above';
      acc[key]++;
      return acc;
   }, { below: 0, above: 0 });
};

console.log(countElements(array, 50));
console.log(countElements(array, 60));
console.log(countElements(array, 70));

코드 설명

  • reduce()의 초기값으로 { below: 0, above: 0 } 객체를 설정합니다.
  • 순회 중인 요소 val이 기준값 num보다 작으면 below 카운트를, 그렇지 않으면(크거나 같으면) above 카운트를 1씩 증가시킵니다.
  • 삼항 연산자로 키 이름을 동적으로 결정해 조건 분기를 간결하게 처리했습니다.

실행 결과

콘솔에는 아래와 같이 기준값별 개수가 객체 형태로 출력됩니다.

{ below: 3, above: 9 }
{ below: 7, above: 5 }
{ below: 8, above: 4 }

예를 들어 기준값이 50일 때는 50 미만인 43, 3, 23 단 3개만 below에 해당하고, 나머지 9개는 모두 above로 집계됩니다.

filter()를 활용한 대안

좀 더 직관적인 코드를 선호한다면 filter() 메서드를 사용할 수도 있습니다.

const countWithFilter = (arr, num) => ({
   below: arr.filter(v => v < num).length,
   above: arr.filter(v => v >= num).length
});

console.log(countWithFilter(array, 60)); // { below: 7, above: 5 }

filter() 방식은 배열을 두 번 순회하기 때문에 성능 면에서는 reduce()보다 약간 불리하지만, 의도가 명확하게 드러나 가독성이 뛰어나다는 장점이 있습니다. 데이터 크기가 크지 않다면 충분히 실용적인 선택입니다.

마무리

이처럼 reduce() 하나만으로도 배열을 한 번의 순회로 여러 통계 값을 누적할 수 있습니다. 조건부 카운팅이 필요한 다양한 상황에서 두 방식을 상황에 맞게 활용해 보시기 바랍니다.