문제
숫자 리터럴로 이루어진 배열을 입력받는 JavaScript 함수를 작성해야 합니다. 이 배열에는 하나 이상의 0이 포함되어 있을 수 있습니다. 함수는 배열을 조작하여 모든 0을 배열의 맨 뒤로 밀어내고, 0이 아닌 나머지 요소들은 기존의 상대적인 순서를 그대로 유지한 채 앞쪽에 배치해야 합니다.
예제
다음은 전체 코드입니다 −
const arr = [5, 0, 1, 0, -3, 0, 4, 6];
const moveAllZero = (arr = []) => {
const res = [];
let currIndex = 0;
for(let i = 0; i < arr.length; i++){
const el = arr[i];
if(el === 0){
res.push(0);
}else{
res.splice(currIndex, undefined, el);
currIndex++;
};
};
return res;
};
console.log(moveAllZero(arr));
출력
다음은 콘솔 출력 결과입니다 −
[ 5, 1, -3, 4, 6, 0, 0, 0 ]
동작 원리
이 코드의 핵심 로직은 다음과 같습니다.
- 배열을 처음부터 끝까지 순회하면서 요소가
0이면push()를 사용해 결과 배열의 맨 뒤에 추가합니다. 0이 아닌 요소라면splice()를 사용해 현재 삽입 위치(currIndex)에 값을 넣고 인덱스를 1 증가시킵니다. 두 번째 인자로undefined를 전달하면 아무 요소도 삭제하지 않고 해당 위치에만 삽입됩니다.- 이 과정을 반복하면 0이 아닌 요소들은 원래 순서대로 앞쪽에 정렬되고, 0은 자연스럽게 뒤쪽으로 밀려나게 됩니다.
더 간단한 대안: filter 활용
같은 결과를 훨씬 직관적으로 얻으려면 filter()를 사용할 수도 있습니다.
const moveAllZero = (arr = []) => {
const nonZero = arr.filter(el => el !== 0);
const zeros = arr.filter(el => el === 0);
return [...nonZero, ...zeros];
};
console.log(moveAllZero([5, 0, 1, 0, -3, 0, 4, 6]));
// [5, 1, -3, 4, 6, 0, 0, 0]
filter()는 원본 배열의 순서를 유지하므로 0이 아닌 요소들의 상대적 위치가 자연스럽게 보존됩니다. 가독성과 유지보수 측면에서는 이 방식이 더 권장되며, 성능이 중요한 대용량 데이터 처리 시에는 위의 단일 순회 방식이 유리할 수 있습니다.