283. Move Zeroes

늘보·2021년 10월 16일
0

LeetCode

목록 보기
42/69

💡 풀이

var moveZeroes = function (nums) {
  let isZero = 0;

  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      nums[isZero] = nums[i];
      isZero++;
    }
  }

  for (; isZero < nums.length; isZero++) nums[isZero] = 0;

  return nums;
};

let nums = [0, 1, 0, 3, 12];
moveZeroes(nums);

📝 정리

이 문제는 투 포인터의 기본적인 동작을 알 수 있는 문제라고 소개한다.(Leetcode에서)
그냥 문제에서 제시한대로 splice 메서드를 이용한다면 O(N*N)의 시간복잡도로 문제를 해결할 수 있다. 그러나 투 포인터를 사용한다면 O(N)의 시간복잡도로 문제를 해결할 수 있다.

문제에서 0은 배열의 뒤쪽으로 옮기라고 했으니, 0이 아닌 숫자들을 찾아서 모두 앞으로 가져온다. 그리고 isZero 포인터를 0이 아닌 숫자를 찾을 때마다 한 칸씩 앞으로 이동하도록 만든다.

그럼 첫 번째 반복문을 다 돌고 나면 nums 배열은 [ 1, 3, 12, 3, 12 ]이 된다. 그럼 [1, 3, 12, 0, 0]으로 만들어 줘야 할텐데, isZero 포인터는 첫 번째 반복문이 끝난 현재 3이기 때문에, index 3부터 nums.length - 1 index까지 0으로 바꿔주면 된다.

수정, 지적을 환영합니다!

문제 링크

https://leetcode.com/problems/move-zeroes/

LeetCode GitHub

https://github.com/tTab1204/LeetCode

0개의 댓글