배열을 입력받아 그 안에서 첫 번째로 연속성이 깨진 숫자(non-consecutive number)의 인덱스를 반환하는 함수를 작성해 보겠습니다.
여기서 배열의 모든 숫자는 공차가 1인 등차수열을 이룬다고 가정합니다. 예를 들어 [1, 2, 3, 4]처럼 각 숫자가 바로 앞 숫자보다 정확히 1씩 커지는 형태입니다. 만약 어떤 숫자가 이 규칙을 위반한다면(즉, 이전 숫자와의 차이가 1이 아니라면), 해당 숫자의 인덱스를 반환하면 됩니다.
반대로 배열의 모든 숫자가 완벽하게 연속적이라면 -1을 반환합니다.
구현 코드
배열을 한 번만 순회하면서 인접한 두 요소의 차이를 검사하는 방식으로 간단하게 해결할 수 있습니다.
const arr = [1,2,3,4,5,6,8,9,10];
const secondArr = [3,4,5,6,7,8,9,10,11,12,13,14,15];
const findException = (arr) => {
// 인접한 두 숫자의 차이가 1이 아니면 연속성이 깨진 지점
for(let i = 0; i < arr.length-1; i++){
if(arr[i+1] - arr[i] !== 1){
return i+1; // 연속성이 깨진 숫자의 인덱스 반환
};
};
// 끝까지 검사했는데 문제가 없다면 -1 반환
return -1;
};
console.log(findException(arr));
console.log(findException(secondArr));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
6 -1
코드 설명
- 첫 번째 배열 [1,2,3,4,5,6,8,9,10]: 인덱스 6의 값이 7이 아닌 8이므로, 6과 8 사이에서 연속성이 깨집니다. 따라서
6이 출력됩니다. - 두 번째 배열 [3,4,5,...,15]: 모든 숫자가 1씩 증가하는 완벽한 등차수열이므로 규칙을 위반하는 숫자가 없고,
-1이 출력됩니다.
이 알고리즘은 배열을 단 한 번 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리 사용 없이 동작하는 효율적인 해결책입니다.