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

JavaScript로 배열에서 연속된 음수가 아닌 숫자 그룹 개수 세는 방법

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')은 두 가지 경우를 모두 처리합니다.

  1. 그룹의 끝이 배열 중간에 있을 때: 현재 값은 0 이상이지만 다음 값이 음수라면, 해당 위치에서 그룹이 끝납니다.
  2. 그룹의 끝이 배열 마지막일 때: 마지막 요소의 다음 인덱스는 존재하지 않으므로 undefined가 되며, 이 역시 그룹의 종료로 간주합니다.

이러한 방식으로 각 그룹의 마지막 요소에서만 카운트가 증가하기 때문에, 정확한 그룹 개수를 구할 수 있습니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

2

마무리

이처럼 reduce()와 간단한 조건문만으로도 배열 내 연속된 숫자 그룹의 개수를 효율적으로 셀 수 있습니다. 시간 복잡도는 O(n)으로 배열을 한 번만 순회하기 때문에 성능 면에서도 우수합니다. 비슷한 패턴을 응용하면 연속된 음수 그룹 세기, 특정 범위의 숫자 그룹 찾기 등 다양한 변형 문제도 손쉽게 해결할 수 있습니다.