JavaScript에서 숫자 배열을 다루다 보면 연속된 음수들이 몇 개의 그룹으로 이루어져 있는지 계산해야 하는 경우가 있습니다. 이번 글에서는 reduce() 메서드를 활용해 이 문제를 간결하게 해결하는 방법을 알아보겠습니다.
문제 상황
다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
이 배열에서 연속된 음수들의 묶음(그룹)이 총 몇 개인지 세는 JavaScript 함수를 작성해야 합니다.
위 배열을 살펴보면 다음과 같습니다.
- 첫 번째 그룹: 인덱스 0부터 2까지의 음수 (-1, -2, -1)
- 두 번째 그룹: 인덱스 4부터 8까지의 음수 (-1, -2, -1, -2, -1)
즉, 이 배열에 대한 함수의 반환값은 2가 되어야 합니다.
해결 방법: reduce() 활용하기
배열의 reduce() 메서드를 사용하면 반복문 없이도 우아하게 이 문제를 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- 현재 요소가 음수인지 확인합니다.
- 현재 요소가 음수이면서 다음 요소가 0 이상(음수가 아님)이라면, 하나의 음수 그룹이 끝난 것이므로 카운트를 증가시킵니다.
코드 구현
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
const countNegativeGroup = arr => {
return arr.reduce((acc, val, ind) => {
if(val < 0 && arr[ind+1] >= 0){
acc++;
};
return acc;
}, 0);
};
console.log(countNegativeGroup(arr));코드 설명
- reduce(acc, val, ind): acc는 누적 카운트, val은 현재 요소, ind는 현재 인덱스입니다.
- val < 0: 현재 값이 음수인지 검사합니다.
- arr[ind+1] >= 0: 다음 값이 0 또는 양수인지 검사하여, 현재 음수가 그룹의 마지막 요소임을 판별합니다.
- 초기값 0: 카운트가 0부터 시작되도록 설정합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
2
마무리
이처럼 reduce() 메서드와 간단한 조건문만으로 연속된 음수 그룹의 개수를 효율적으로 계산할 수 있습니다. 시간 복잡도는 O(n)으로, 배열을 한 번만 순회하기 때문에 성능 면에서도 매우 효율적입니다. 비슷한 방식으로 양수 그룹이나 특정 조건을 만족하는 연속 구간의 개수도 손쉽게 응용할 수 있습니다.