JavaScript 프로그래밍을 하다 보면 배열 안에서 특정 조건을 만족하는 숫자들이 연속으로 나타나는 구간, 즉 '그룹'의 개수를 세어야 하는 경우가 있습니다. 이번 글에서는 음수가 아닌 숫자(0과 양수)가 연속으로 등장하는 그룹의 개수를 세는 방법을 알아보겠습니다.
문제 상황
다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
여기서 우리가 작성해야 할 함수는 배열 내에서 음수가 아닌 숫자(양수와 0)가 연속으로 나타나는 그룹의 개수를 반환해야 합니다.
위 배열을 살펴보면 다음과 같습니다.
- 인덱스 3에 있는 값
0: 단 하나의 요소지만 독립적인 하나의 그룹을 형성합니다. - 인덱스 9부터 배열 끝까지의 값
0, 1, 0: 두 번째 그룹을 형성합니다.
따라서 이 배열에 대해 함수는 2를 반환해야 합니다.
해결 코드
이 문제는 배열 메서드인 reduce()를 활용하면 간결하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
- 현재 요소가 0 이상인지 확인합니다.
- 동시에 다음 요소가 음수이거나, 배열의 끝(
undefined)이라면 현재 그룹이 종료되는 지점이므로 카운트를 1 증가시킵니다.
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
const positiveClusters = arr => {
return arr.reduce((acc, val, ind) => {
if(val >= 0 && (arr[ind+1] < 0 || typeof arr[ind+1] === 'undefined')){
acc++;
};
return acc;
}, 0);
};
console.log(positiveClusters(arr));코드 동작 원리
reduce() 메서드의 역할
reduce()는 배열의 각 요소를 순회하면서 누적값(acc)을 계산합니다. 초기값을 0으로 설정했기 때문에, 그룹의 개수가 차례대로 누적됩니다.
조건문 분석
조건 val >= 0 && (arr[ind+1] < 0 || typeof arr[ind+1] === 'undefined')은 두 가지 경우를 모두 처리합니다.
- 그룹의 끝이 배열 중간에 있을 때: 현재 값은 0 이상이지만 다음 값이 음수라면, 해당 위치에서 그룹이 끝납니다.
- 그룹의 끝이 배열 마지막일 때: 마지막 요소의 다음 인덱스는 존재하지 않으므로
undefined가 되며, 이 역시 그룹의 종료로 간주합니다.
이러한 방식으로 각 그룹의 마지막 요소에서만 카운트가 증가하기 때문에, 정확한 그룹 개수를 구할 수 있습니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
2
마무리
이처럼 reduce()와 간단한 조건문만으로도 배열 내 연속된 숫자 그룹의 개수를 효율적으로 셀 수 있습니다. 시간 복잡도는 O(n)으로 배열을 한 번만 순회하기 때문에 성능 면에서도 우수합니다. 비슷한 패턴을 응용하면 연속된 음수 그룹 세기, 특정 범위의 숫자 그룹 찾기 등 다양한 변형 문제도 손쉽게 해결할 수 있습니다.