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

JavaScript에서 배열의 모든 0을 끝으로 이동하는 알고리즘 작성하기

문제 개요

배열을 입력받아 배열에 포함된 모든 0(zero)을 추가 공간을 사용하지 않고 배열의 끝으로 이동시키는 함수를 작성해야 합니다. 이 문제는 Array.prototype.splice()Array.prototype.push() 메서드를 활용하면 간단하게 해결할 수 있습니다.

해결 접근 방식

핵심 아이디어는 다음과 같습니다.

  • 배열을 순회하면서 값이 0인 요소를 발견하면 해당 위치에서 요소를 제거합니다.
  • 제거한 요소를 즉시 배열의 맨 뒤에 추가(push)합니다.
  • 요소가 제거되면서 뒤의 요소들이 한 칸씩 앞으로 당겨지므로, 인덱스를 1 감소시켜(ind--) 누락되는 요소가 없도록 합니다.

코드 예제

const arr = [34, 6, 76, 0, 0, 343, 90, 0, 32, 0, 34, 21, 54];

const moveZero = (arr) => {
   for(ind = 0; ind < arr.length; ind++){
      const el = arr[ind];
      if(el === 0){
         arr.push(arr.splice(ind, 1)[0]);
         ind--;
      };
   }
};

moveZero(arr);
console.log(arr);

출력 결과

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

[34, 6, 76, 343, 90, 32, 34, 21, 54, 0, 0, 0, 0]

코드 상세 설명

arr.splice(ind, 1)은 인덱스 ind 위치의 요소를 원본 배열에서 제거하면서, 제거된 요소를 담은 새 배열을 반환합니다. 반환값의 첫 번째 요소([0])를 push()로 배열 끝에 붙이면 해당 0이 자연스럽게 뒤로 이동합니다. 이 과정 전체가 원본 배열 내부에서 이루어지기 때문에 별도의 임시 배열 없이 해결할 수 있다는 점이 이 방식의 가장 큰 장점입니다.

또한 요소를 제거한 직후에는 뒤쪽 요소들이 한 칸씩 앞으로 이동하므로, 반드시 ind--로 현재 인덱스를 다시 검사해야 합니다. 이 처리가 없으면 연속된 0(예: [0, 0])을 건너뛰게 되어 일부 0이 끝으로 이동하지 못하는 버그가 발생할 수 있습니다.