해당 포스팅은 릿코드 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가지며 각 경우에 대해 취해야 하는 동작은 다음과 같다.
예제 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;
};