[LeetCode] 283. Move Zeroes(JavaScript)

jeongjin Kim·2021년 11월 5일
0

문제설명

interger를 포함한 배열 nums이 주어졌을 때, 나머지 원소의 상대적 순서를 유지하면서 모든 0을 배열의 끝으로 보내시오.
Note 복사본을 만들지 않고 이 배열안에서 자체적으로 해결해야 합니다

입출력 예

Ex 1:

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

Ex 2:

Input: nums = [0]
Output: [0]

풀이과정

  • 제일 처음 생각했던 방법은 nums.forEach 반복문을 사용해서 element===0 일때, nums.splice(index, 1)으로 0을 제거하고 nums.push(0)를 해주는 것이었습니다.

아래의 코드

var moveZeroes = function(nums) {
    nums.forEach((element,index)=>{
        if(element===0){
            nums.splice(index,1)
            nums.push(0)
       
        }
    })
};
  • 주어진 테스트 케이스는 통과했지만 실제 테스트에서 실패했습니다. 문제는 0이 두 번 연속으로 있을때 생겼습니다.

[0,0,3] 이라는 nums를 예로들자면, index 0에있는 첫 0은 제대로 끝으로 옮겨지지만 첫 0이 사라지는 바람에 두 번째 0이 첫 index로 옮겨지게 되고, forEach는 그 다음인 index 1로 옮겨진 3부터 다음 반복을 시작했습니다.

즉 forEach가 두 번째 0은 스킵하는 문제였습니다.

풀이

  • 어떻게 하면 연속되는 0이 스킵되지 않게 할까를 고민했는데 해답은 의외로 간단했습니다. 저의 접근법 자체는 그대 사용하고 반복문을 앞이 아니라 뒤에서 부터 시작하면 해결되는 문제였습니다.
var moveZeroes = function(nums) {
  for(i = nums.length; i>=0; i--)
      if(nums[i]===0){
        nums.splice(i,1);
        nums.push(0)
      }
};
  • 이 방법을 사용하면 index의 변화로 인한 다음 원소가 스킵되는 문제를 해결할 수 있습니다.

Extra

var moveZeroes = function(nums) {
  for(i = nums.length; i>=0; i--)
      if(nums[i]===0){
        nums.splice(i,1);
        nums.push(0)
      }
};

위의 코드를 논리 연산자 &&을 사용해서 더 간략하게 줄일 수 있습니다.

var moveZeroes = function(nums) {
for(i = nums.length; i >= 0; i--) {
	nums[i]===0 && nums.splice(i, 1) && nums.push(0)
}
  • &&을 사용하면 if문을 사용하지 않고도 boolean 값을 받을 수 있습니다.

0개의 댓글