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

JavaScript로 연속된 숫자 기준으로 정렬된 배열을 그룹화하는 방법

다음과 같이 오름차순으로 정렬된 정수 배열이 있다고 가정해 보겠습니다.

const arr = [1, 2, 3, 5, 6, 7, 10, 12, 17, 18];

이 배열을 입력으로 받아 다음 조건에 맞게 그룹화하는 JavaScript 함수를 작성해야 합니다.

  • 같은 그룹 내의 요소들은 서로 차이가 1 이하여야 합니다.

  • 각 그룹은 유효한 그룹으로 인정되기 위해 두 개 이상의 요소를 포함해야 합니다.

위 조건을 적용하면 기대되는 출력 결과는 다음과 같습니다.

const output = [
    [1, 2, 3],
    [5, 6, 7],
    [17, 18]
];

동작 원리

이 문제는 배열이 이미 정렬되어 있다는 점을 활용하면 간단하게 해결할 수 있습니다. 현재 요소가 이전 요소보다 정확히 1 크면 같은 그룹에 속하고, 현재 요소가 다음 요소보다 정확히 1 작으면 새로운 그룹을 시작한다는 규칙을 사용합니다. 이렇게 하면 단 한 번의 반복문으로 모든 그룹을 찾을 수 있으며, 시간 복잡도는 O(n)입니다.

예제 코드

구현 코드는 다음과 같습니다.

const arr = [1, 2, 3, 5, 6, 7, 10, 12, 17, 18];

const groupNear = (arr = []) => {
    const res = [];
    for (let ind = 0; ind < arr.length; ind++) {
        let value = arr[ind];
        // 이전 요소와 차이가 1이면 기존 그룹에 추가
        if (arr[ind - 1] + 1 === value) {
            res[res.length - 1].push(value);
        }
        // 다음 요소와 차이가 1이면 새로운 그룹 시작
        else if (value + 1 === arr[ind + 1]) {
            res.push([value]);
        }
    };
    return res;
};

console.log(groupNear(arr));

출력 결과

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

[ [ 1, 2, 3 ], [ 5, 6, 7 ], [ 17, 18 ] ]

결과를 보면 [1, 2, 3], [5, 6, 7], [17, 18]처럼 연속된 숫자들만 그룹으로 묶였고, 10과 12처럼 앞뒤 요소와 차이가 1보다 큰 값들은 자연스럽게 제외된 것을 확인할 수 있습니다.