숫자로 이루어진 배열을 다룰 때, 연속된 수열 중간에 끊긴 지점을 찾아야 하는 경우가 종종 있습니다. 이번 글에서는 배열에서 이전 요소의 자연스러운 연속값(+1)이 아닌 첫 번째 숫자를 찾아 반환하는 JavaScript 함수를 작성해 보겠습니다.
문제 정의
우리가 작성해야 할 함수는 숫자 배열을 인수로 받습니다. 함수의 목표는 다음과 같습니다.
- 배열을 순회하면서 각 요소가 바로 앞 요소보다 정확히 1만큼 큰지 확인합니다.
- 이 조건을 만족하지 않는, 즉 앞 요소 + 1이 아닌 첫 번째 요소를 반환합니다.
- 배열 전체가 완벽하게 연속적이라면
null을 반환합니다.
예를 들어 [1, 2, 3, 4, 6, 7, 8]이라는 배열이 있다면, 4 다음에 나오는 6은 앞 요소보다 1이 아니라 2만큼 크므로 6이 결과가 됩니다.
구현 코드
다음은 위 문제를 해결하는 JavaScript 코드입니다.
const arr = [1, 2, 3, 4, 6, 7, 8];
const findFirstNonConsecutive = (arr = []) => {
for(let i = 0; i < arr.length - 1; i++){
const el = arr[i];
const next = arr[i + 1];
if(next - el !== 1){
return next;
};
};
return null;
};
console.log(findFirstNonConsecutive(arr));
코드 동작 원리
코드의 핵심 로직을 단계별로 살펴보겠습니다.
- 반복 범위 설정: 마지막 요소에는 '다음 요소'가 존재하지 않으므로, 반복문은
arr.length - 1까지 실행됩니다. - 현재 요소와 다음 요소 비교: 변수
el에 현재 요소를,next에 바로 뒤의 요소를 저장합니다. - 차이 검사:
next - el !== 1조건으로 두 요소의 차이가 1이 아닌지 확인합니다. 차이가 1이 아니라면 연속성이 깨진 것이므로next를 즉시 반환합니다. - 연속적인 경우 처리: 모든 요소가 연속적이라면 반복문이 종료된 후
null을 반환하여 예외 상황을 안전하게 처리합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
6
배열 [1, 2, 3, 4, 6, 7, 8]에서 4와 6 사이에 연속성이 깨져 있으므로, 함수는 첫 번째 비연속 숫자인 6을 올바르게 반환합니다.
마무리
이처럼 단순한 선형 탐색(O(n))만으로도 배열 내 연속성이 깨진 첫 번째 지점을 효율적으로 찾을 수 있습니다. 시간 복잡도는 O(n)이며, 공간 복잡도는 O(1)로 추가 메모리 사용 없이 동작하기 때문에 실무에서도 충분히 활용할 수 있는 패턴입니다.