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

재귀 함수로 JavaScript 배열에서 연속된 중복 요소 제거하기

이번 글에서는 숫자 또는 문자열 리터럴로 구성된 배열을 입력받아, 연속으로 반복되는 중복 요소를 제거하는 함수를 작성해 보겠습니다. 여기서 핵심 조건은 추가적인 메모리 공간을 사용하지 않고 원본 배열 자체를 수정해야 한다는 점입니다.

예를 들어, 다음과 같은 입력 배열이 있다고 가정해 보겠습니다.

const arr = [17, 17, 17, 12, 12, 354, 354, 1, 1, 1];

연속된 중복 항목이 모두 제거되면 결과는 다음과 같아야 합니다.

const output = [17, 12, 354, 1];

주의할 점은 배열 전체에서 고유한 값만 남기는 것이 아니라, 바로 앞 요소와 값이 같은 경우에만 제거한다는 것입니다. 예를 들어 [1, 2, 1]처럼 같은 값이 떨어져 나타나는 경우에는 그대로 유지됩니다.

재귀를 활용한 해결 방법

반복문 대신 재귀 호출을 사용하면 코드를 간결하게 작성할 수 있습니다. 아래 코드는 현재 위치의 요소와 다음 요소를 비교하고, 두 값이 동일하면 해당 요소를 삭제한 뒤 다음 위치로 이동하는 방식으로 동작합니다.

예제 코드

const arr = [17, 17, 17, 12, 12, 354, 354, 1, 1, 1];
const comp = (arr, len = 0, deletable = false) => {
   if(len < arr.length){
      if(deletable){
         arr.splice(len, 1);
         len--;
      }
      return comp(arr, len+1, arr[len] === arr[len+1])
   };
   return;
};
comp(arr);
console.log(arr);

코드 동작 방식 살펴보기

  • len: 현재 검사 중인 인덱스를 나타냅니다.
  • deletable: 이전 단계에서 현재 요소가 앞 요소와 중복되었는지 여부를 저장합니다.
  • 중복된 요소라면 splice() 메서드로 배열에서 제거하고, 인덱스를 하나 되돌려(len--) 올바른 위치를 계속 검사할 수 있도록 합니다.
  • 배열의 끝에 도달하면 재귀 호출이 종료되며, 원본 배열에는 연속 중복이 제거된 결과만 남게 됩니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[ 17, 12, 354, 1 ]

이처럼 재귀 함수와 splice()를 조합하면 별도의 임시 배열 없이도 원본 배열에서 연속된 중복 요소를 효율적으로 제거할 수 있습니다.