이번 글에서는 숫자로 이루어진 두 개의 배열을 입력받아, 두 배열의 모든 요소를 합치고 임의로 섞었을 때 연속적인(consecutive) 수열을 만들 수 있는지 판별하는 JavaScript 함수를 작성해 보겠습니다. 조건을 만족하면 true, 그렇지 않으면 false를 반환해야 합니다.
예를 들어 다음과 같은 두 배열이 있다고 가정해 보겠습니다.
const arr1 = [4, 6, 2, 9, 3]; const arr2 = [1, 5, 8, 7];
두 배열을 합치면 [4, 6, 2, 9, 3, 1, 5, 8, 7]이 되고, 이를 오름차순으로 정렬하면 [1, 2, 3, 4, 5, 6, 7, 8, 9]처럼 1부터 9까지 빠짐없이 이어지는 연속된 수열이 됩니다. 따라서 이 경우 출력값은 true여야 합니다.
문제 해결 접근 방식
핵심 아이디어는 매우 간단합니다.
- 스프레드 연산자(...)를 사용해 두 배열을 하나로 합칩니다.
- 합쳐진 배열을 오름차순으로 정렬합니다.
- 첫 번째 요소와 두 번째 요소의 차이(공차)를 기준값으로 저장합니다.
- 배열을 순회하며 인접한 요소 간의 차이가 항상 기준값과 같은지 확인하고, 하나라도 다르면 즉시 false를 반환합니다.
모든 인접 요소의 차이가 일정하면 등차수열이고, 특히 정렬된 상태에서 차이가 정확히 -1이라면 1씩 증가하는 완전한 연속 수열임을 의미합니다. 참고로 배열의 길이가 2 미만인 경우(빈 배열 또는 요소가 하나뿐인 배열)에는 자명하게 true를 반환하도록 처리했습니다.
예제 코드
const arr1 = [4, 6, 2, 9, 3];
const arr2 = [1, 5, 8, 7];
const canFormSequence = (arr1, arr2) => {
const combined = [...arr1, ...arr2];
if(combined.length < 2){
return true;
};
combined.sort((a, b) => a-b);
const commonDifference = combined[0] - combined[1];
for(let i = 1; i < combined.length-1; i++){
if(combined[i] - combined[i+1] === commonDifference){
continue;
};
return false;
};
return true;
};
console.log(canFormSequence(arr1, arr2));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true
추가로 알아두면 좋은 점
이 알고리즘은 sort 메서드 때문에 평균적으로 O(n log n)의 시간 복잡도를 가집니다. 또한 중복된 값이 포함된 경우 인접 요소의 차이가 0이 되어 공차(-1)와 일치하지 않으므로, 별도의 중복 검사 없이도 자연스럽게 false가 반환됩니다. 덕분에 코드가 간결하면서도 다양한 입력 케이스를 안정적으로 처리할 수 있습니다.