다음과 같이 오름차순으로 정렬된 정수 배열이 있다고 가정해 보겠습니다.
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보다 큰 값들은 자연스럽게 제외된 것을 확인할 수 있습니다.