문제 개요
배열을 입력받아 배열에 포함된 모든 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이 끝으로 이동하지 못하는 버그가 발생할 수 있습니다.