[code-kata]Week3 - Day4

이해용·2022년 7월 30일
0
post-thumbnail

문제

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

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

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

나의 풀이

처음 for문을 돌릴 때 될 줄 알았으나 배열안에서 0이 순서대로 중복이 된다면 리턴할 때 자꾸 0이 하나만 남게 되었었다.

let nums = [0, 0, 0, 10, 10, 13, 0, 0, 9 ,7];

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

console.log(movezeroes(nums)); // [ 0, 10, 10, 13, 0, 9, 7, 0, 0, 0 ]

이 부분에 대해서 이해가 가지 않아 for문을 한 번 더 돌려서 테스트 통과는 되었으나 for문을 한 번 돌리면 0이 2번 중복되었을 때 0이 하나 남게 되고 for문을 2번 돌렸을 때 4번 연속으로 나오면 0이 맨 앞에 하나가 남게 되었다.

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

다른 사람의 풀이

구글링을 해보니 다른 사람들은 배열을 거꾸로 시작하여 진행하니 코드가 더 간단하게 실행되었다.

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

0의 값이 마지막으로 가야하다보니 뒤에서 부터 시작하면 배열이 삭제되고 추가되어도 그대로 배열의 순서대로 값이 삭제되고 추가 되기 때문에 중복된 값의 오류를 없앨 수 있지 않을까 생각이 들었다.

테스트는 통과되었으나 완벽하지 않은 코드를 구현해서 아쉬움이 남았다. 배열이 추가되고 삭제되는 것에 따라 for문을 처음부터 시작해야할지 마지막부터 시작해야할지 잘 고민을 해봐야겠다.

reference
https://velog.io/@april_5/CodeKata-14-%EC%A3%BC%EC%96%B4%EC%A7%84-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4%EC%97%90%EC%84%9C-0%EC%9D%84-%EB%B0%B0%EC%97%B4%EC%9D%98-%EB%A7%88%EC%A7%80%EB%A7%89%EC%AA%BD%EC%9C%BC%EB%A1%9C-%EC%9D%B4%EB%8F%99%EC%8B%9C%ED%82%A4%EA%B8%B0

profile
프론트엔드 개발자입니다.

0개의 댓글