문제 정의
배열에 들어 있는 숫자들 중에서 주어진 기준 값보다 작은 요소와 그 이상인 요소가 각각 몇 개인지 세는 함수를 작성해야 합니다.
먼저 다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const array = [54,54,65,73,43,78,54,54,76,3,23,78];
예를 들어 기준 값이 60이라면, 이보다 작은 요소는 아래와 같이 총 7개입니다.
54, 54, 43, 54, 54, 3, 23
반대로 60 이상인 요소(par)는 다음과 같이 5개입니다.
65, 73, 78, 76, 78
구현 코드
배열 메서드 reduce()를 활용하면 배열을 단 한 번만 순회하면서 두 개수를 동시에 계산할 수 있습니다.
const array = [54,54,65,73,43,78,54,54,76,3,23,78];
const belowParNumbers = (arr, num) => {
return arr.reduce((acc, val) => {
const legend = ['par', 'below'];
const isBelow = val < num;
acc[legend[+isBelow]]++;
return acc;
}, {
below: 0,
par: 0
});
};
console.log(belowParNumbers(array, 50));
console.log(belowParNumbers(array, 60));
console.log(belowParNumbers(array, 70));
코드 동작 원리
reduce()의 초기 누적값으로{ below: 0, par: 0 }객체를 설정합니다.- 순회 중인 각 요소가
num보다 작은지 비교한 결과를isBelow변수에 저장합니다. +isBelow는 불리언 값을 숫자로 변환합니다(true → 1, false → 0).- 변환된 값으로
legend배열('par', 'below')에서 키를 선택한 뒤, 해당 카운트를 1씩 증가시킵니다. - 모든 요소를 순회하면 기준 값 미만(
below)과 이상(par) 요소의 개수가 담긴 객체가 반환됩니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
{ below: 3, par: 9 }
{ below: 7, par: 5 }
{ below: 8, par: 4 }
결과를 해석해 보면, 기준 값이 50일 때는 50 미만인 요소가 3개(43, 3, 23)이고 나머지 9개는 50 이상입니다. 마찬가지로 기준 값이 60일 때는 7개와 5개로, 70일 때는 8개와 4개로 각각 분류되는 것을 확인할 수 있습니다.