주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동시켜주세요. 원래 있던 숫자의 순서는 바꾸지 말아주세요.
(새로운 배열을 생성해서는 안 됩니다.)
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
처음 for문을 돌릴 때 될 줄 알았으나 배열안에서 0이 순서대로 중복이 된다면 리턴할 때 자꾸 0이 하나만 남게 되었었다.
let nums = [0, 0, 0, 10, 10, 13, 0, 0, 9 ,7];
const moveZeroes = nums => {
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 0) {
nums.splice(i, 1);
nums.push(0);
}
}
return nums;
}
console.log(movezeroes(nums)); // [ 0, 10, 10, 13, 0, 9, 7, 0, 0, 0 ]
이 부분에 대해서 이해가 가지 않아 for문을 한 번 더 돌려서 테스트 통과는 되었으나 for문을 한 번 돌리면 0이 2번 중복되었을 때 0이 하나 남게 되고 for문을 2번 돌렸을 때 4번 연속으로 나오면 0이 맨 앞에 하나가 남게 되었다.
const moveZeroes = nums => {
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 0) {
nums.splice(i, 1);
nums.push(0);
}
for (let j = 0; j < nums.length; j++) {
if (nums[j] === 0) {
nums.splice(j, 1);
nums.push(0);
}
}
}
return nums;
}
구글링을 해보니 다른 사람들은 배열을 거꾸로 시작하여 진행하니 코드가 더 간단하게 실행되었다.
const moveZeroes = nums => {
for(i = nums.length-1; i >= 0; i--){
if(nums[i] === 0){
nums.push(nums.splice(i, 1)[0]);
}
}
return nums
};
0의 값이 마지막으로 가야하다보니 뒤에서 부터 시작하면 배열이 삭제되고 추가되어도 그대로 배열의 순서대로 값이 삭제되고 추가 되기 때문에 중복된 값의 오류를 없앨 수 있지 않을까 생각이 들었다.
테스트는 통과되었으나 완벽하지 않은 코드를 구현해서 아쉬움이 남았다. 배열이 추가되고 삭제되는 것에 따라 for문을 처음부터 시작해야할지 마지막부터 시작해야할지 잘 고민을 해봐야겠다.