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

JavaScript 배열 순회하며 연속된 't' 값 묶음 개수 구하기

데이터베이스에서 조회한 't'(true)'f'(false)로 표현된 불리언 배열이 있다고 가정해 보겠습니다.

const arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];

우리가 작성해야 할 함수는 이러한 배열을 하나의 인자로 받아서, 앞뒤로 'f'에 둘러싸여 있는 연속된 't' 값들의 묶음(cluster)별 개수를 계산한 뒤, 그 결과를 배열 형태로 반환하는 것입니다.

따라서 위 배열의 경우 각 't' 묶음의 길이는 다음과 같습니다.

const output = [1, 3, 6, 1];

문제 접근 방식

이 문제는 배열의 reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. 누적 배열(acc)의 마지막 요소를 기준으로 다음과 같이 처리합니다.

  • 현재 값이 't'라면 → 마지막 카운트를 1 증가
  • 현재 값이 'f'이고 마지막 카운트가 0이 아니라면 → 새로운 카운트 0을 추가

이렇게 하면 'f'와 'f' 사이에 존재하는 't' 묶음만 정확히 집계됩니다.

예제 코드

const arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];
const countClusters = (arr = []) => {
    let res = [];
    res = arr.reduce((acc, val) => {
        const { length: l } = acc;
        if(val === 't'){
            acc[l - 1]++;
        }
        else if(acc[l - 1] !== 0){
            acc.push(0);
        };
        return acc;
    }, [0]);
    return res;
};
console.log(countClusters(arr));

코드 동작 원리

초기값으로 [0]을 설정하고, 요소를 하나씩 순회하며 't'를 만나면 마지막 값을 증가시킵니다. 'f'를 만나면 지금까지 집계된 값이 있을 때만 새로운 0을 추가하여 다음 묶음을 준비합니다. 최종적으로 초기값의 0은 결과에 포함되지 않도록 처리된 형태로 반환됩니다.

출력 결과

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

[ 1, 3, 6, 1 ]

이처럼 reduce()를 활용하면 별도의 반복문 없이도 연속된 값의 묶음을 손쉽게 집계할 수 있습니다.