210902 배열에서 0만 맨 뒤로 이동시키기

박은정·2021년 9월 2일
0

문제

주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동시켜주세요.
원래 있던 숫자의 순서는 바꾸지 말아주세요.

(새로운 배열을 생성해서는 안 됩니다.)

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

문제이해

원래 있던 숫자는 그대로 냅둬야되고 새로운 배열도 생성하면 안되기 때문에
기존의 배열을 활용해야 한다

그래서 배열의 요소를 for문으로 탐색하면서
만약 해당하는 요소가 0이라면 그 값을 삭제하고 + 맨 뒤로 push처리해준다
-1+1

정답

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

코드설명

for(i = nums.length-1; i >= 0; i--){
}

배열의 처음부터 끝까지 찾을건데 만약 평소처럼

for(i=0; i<nums.length; i++)

이렇게 조건을 잡아버리면 다음과 같이 0이 나와서 뒤로 push하고 배열이 변경되었을 때

미처 확인하지 못하는 요소가 있기 때문에

push 로 기존의 배열을 변경하면서 배열의 요소를 전부 확인하고 싶다면
마음편하게 for문의 조건을 뒤에서부터 앞으로 감소시키는 형식으로 찾는게 좋을것같다

if(nums[i]===0) nums.push(nums.splice(i, 1)[0]);

만약 해당하는 요소가 0일 때만 해당하는 갑을 배열의 끝으로 push한다
근데 push를 하게 되면 배열의 요소가 늘어나는게 아닐까 생각할 수 있겠지만

// 잘못된 방법이다!!
if(nums[i]===0) nums.push(nums[i]);

이런식으로 push하는 대상이 nums[i] 이면 당연히 배열의 길이가 늘어나겠지만
nums.splice(i, 1) 을 통해 먼저 배열에서 해당하는 i번째 요소의 한자리만 삭제하고
잘려진 값을 return처리 된다

nums.splice(i, 1)[0]

그리고 nums.splice(i, 1)의 반환값이 배열의 형태로 나오고
push를 해주려는 값은 Number 이기 때문에 배열의 0번째 요소만 위와같이 뽑아내고
Push처리를 해준 것이다

만약 해당하는 요소가 0이 아니라면 조건문은 그냥 통과해서 바로 다음요소로 반복하기 때문에
기존의 다른 요소들의 순서로 손 댈 일이 없다

내용이 어려웠으니 이후에 다시 복습을 했으면 좋겠다!

profile
새로운 것을 도전하고 노력한다

0개의 댓글