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

JavaScript로 두 배열을 합쳐 연속된 수열을 만들 수 있는지 확인하는 방법

이번 글에서는 숫자로 이루어진 두 개의 배열을 입력받아, 두 배열의 모든 요소를 합치고 임의로 섞었을 때 연속적인(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여야 합니다.

문제 해결 접근 방식

핵심 아이디어는 매우 간단합니다.

  1. 스프레드 연산자(...)를 사용해 두 배열을 하나로 합칩니다.
  2. 합쳐진 배열을 오름차순으로 정렬합니다.
  3. 첫 번째 요소와 두 번째 요소의 차이(공차)를 기준값으로 저장합니다.
  4. 배열을 순회하며 인접한 요소 간의 차이가 항상 기준값과 같은지 확인하고, 하나라도 다르면 즉시 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가 반환됩니다. 덕분에 코드가 간결하면서도 다양한 입력 케이스를 안정적으로 처리할 수 있습니다.