283. Move Zeroes 풀이 - js

fgStudy·2022년 6월 1일
0

코딩테스트

목록 보기
36/69
post-thumbnail

해당 포스팅은 릿코드 283번 Move Zeroes 풀이를 다룬다. 문제 링크
코드는 javascript로 작성하였으며 투포인터 문제이다.


문제

Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

정수 배열 nums가 주어지면 0이 아닌 요소의 상대적 순서를 유지하면서 모든 0을 끝으로 이동시키자.

array를 복제하지 않고 구현해보자.


예제

Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]
Input: nums = [0]
Output: [0]

풀이

array를 복제하지 않고 구현하라고 했으므로 투포인터를 이용해서 풀어보자.
투포인터를 이용해서 조건에 따라 포인터를 움직이고 두 포인터의 값을 swipe하자.

먼저 배열의 원소를 처음부터 비교하고 위치를 교환해주기 위해 포인터를 s = 0, e = 1로 선언하자.

투포인터로 풀이 시 가능한 Case는 총 3가지며 각 경우에 대해 취해야 하는 동작은 다음과 같다.


case 1. nums[s] === 0 && nums[e] === 0

  • 그 다음 원소 중에 0이 아닌 값이 있으면 포인터 s의 값과 e의 값을 바꾸어주어야 한다. 따라서 e를 한칸 뒤로 넘긴다.
  • e += 1

case 2. nums[s] !== 0 && nums[e] === 0

  • 제대로 정렬되어 있으므로 이후 그 다음 쌍들에 대해 값을 비교하기 위해 s, e를 한 칸씩 뒤로 넘긴다.
  • s, e를 한 칸씩 뒤로 넘기기

case 3. nums[s] === 0 && nums[e] !== 0

  • 0을 배열의 끝으로 이동시켜야 하므로 포인터 s의 값을 e의 값과 변경해주어야 한다.
  • 두 포인터의 값을 swipe하기
  • 그 다음 쌍들에 대해 값을 비교하기 위해 s, e를 한 칸씩 뒤로 넘기기

예제: nums = [0,1,0,3,12]

예제 nums = [0,1,0,3,12]를 통해 로직을 설명하겠다.


전체 코드

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */

// 케이스 3가지
// case 1. nums[s] === 0 && nums[e] === 0
// - e += 1

// case 2. nums[s] !== 0 && nums[e] === 0
// - s, e 한 칸씩 뒤로 넘기기

// case 3. nums[s] === 0 && nums[e] !== 0
// - swipe
// - s, e 한 칸씩 뒤로 넘기기

var moveZeroes = function(nums) {
    s = 0;
    e = 1;
    while (e < nums.length) {
        if (nums[s] === 0 && nums[e] === 0) {
            e += 1;
            continue;
        }
        
        if (nums[s] === 0 && nums[e] !== 0) {
            [nums[s], nums[e]] = [nums[e], nums[s]];
        }
        s += 1;
        e += 1;
    }
    return nums;
};
profile
지식은 누가 origin인지 중요하지 않다.

0개의 댓글