다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
우리는 이 배열에서 연속된 비음수(양수 또는 0) 숫자들의 그룹, 즉 클러스터가 몇 개인지 세는 JavaScript 함수를 작성해야 합니다.
위 배열을 예로 들면, 인덱스 3의 값 0이 하나의 클러스터를 이루고(요소가 하나뿐이라도 하나의 그룹으로 간주합니다), 인덱스 9부터 배열 끝까지의 0, 1, 0이 두 번째 클러스터를 이룹니다.
따라서 이 배열에 대해 함수는 2를 반환해야 합니다.
해결 아이디어
핵심 로직은 간단합니다. 배열을 순회하면서 현재 요소가 0 이상이고, 바로 다음 요소가 음수이거나 존재하지 않는 경우(즉, 현재 요소가 해당 클러스터의 마지막 요소인 경우) 카운트를 1씩 증가시키면 됩니다.
예제 코드
다음은 reduce() 메서드를 활용한 전체 코드입니다.
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()는 초기값0에서 시작하여 배열의 각 요소를 순회하며 누적값acc를 관리합니다.- 현재 값
val이0이상인지 확인하여 비음수인지 판별합니다. - 동시에 다음 요소
arr[ind+1]이 음수이거나undefined(배열의 끝)인지 검사합니다. 이 조건이 참이면 현재 요소가 하나의 클러스터가 끝나는 지점이므로 카운트를 증가시킵니다.
출력 결과
콘솔에 다음과 같은 결과가 출력됩니다.
2
이처럼 reduce()를 사용하면 별도의 반복문 없이도 간결하게 연속된 양수 클러스터의 개수를 계산할 수 있습니다.