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

자바스크립트 배열에서 연속된 중복 요소를 재귀적으로 제거하는 방법

다음과 같이 숫자 리터럴로 구성된 배열에 연속으로 중복된 값들이 포함되어 있다고 가정해 보겠습니다.

const testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1];

우리는 이 배열을 인자로 받아 연속된 중복 항목을 제자리(in-place)에서 모두 제거하는 compress 함수를 작성해야 합니다. 함수 실행 후 배열은 다음과 같은 형태가 됩니다.

const output = [1, 2, 3, 1];

주의할 점은 단순히 고유한 값만 남기는 것이 아니라, 연속해서 반복되는 항목만 제거한다는 것입니다. 위 예시에서 마지막의 1은 앞의 3과 연속되지 않으므로 그대로 유지됩니다.

예제 코드

이번에는 재귀(recursion)를 활용하여 이 문제를 해결해 보겠습니다. 코드는 다음과 같습니다.

const testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1];
const compress = (arr, len = 0, canDelete = false) => {
    if(len < arr.length){
        if(canDelete){
            arr.splice(len, 1);
            len--;
        }
        return compress(arr, len+1, arr[len] === arr[len+1])
    };
    return;
};
compress(testArr);
console.log(testArr);

코드 동작 원리

compress 함수는 세 개의 매개변수를 사용합니다.

  • arr: 중복 제거를 수행할 대상 배열입니다.
  • len: 현재 검사하고 있는 인덱스를 나타내며, 기본값은 0입니다.
  • canDelete: 현재 요소가 바로 앞 요소와 동일하여 삭제해야 하는지 여부를 나타냅니다.

함수는 len이 배열 길이보다 작은 동안 재귀적으로 호출됩니다. canDelete가 true라면 splice 메서드로 해당 요소를 제거한 뒤 인덱스를 한 칸 뒤로 물립니다(len--). 이후 현재 요소와 다음 요소를 비교한 결과를 다음 재귀 호출의 canDelete 값으로 전달합니다. len이 배열 끝에 도달하면 재귀가 종료되고, 배열에는 연속된 중복이 모두 제거된 상태로 남게 됩니다.

출력 결과

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

[ 1, 2, 3, 1 ]