TIL 62 day 알고리즘/코딩테스트

배열 내의 0 마지막으로 옮기기

  • 주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동 시키는 함수.
  • 원래 있던 숫자의 순서는 바꾸지 말 것.
  • 새로운 배열 만들지 말 것!!
  • 입출력 예시 :
    [0,1,0,3,12] => [1,3,12,0,0]

작성

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

문제를 보고 처음 든 생각은 pop이나 push를 사용하고 싶다는 것이었다.
일반적으로 사용하는 for문은 인덱스 0부터 즉, 배열의 앞부터 확인해 나가기 때문에 pop이나 push를 사용하기 부적합하다는 생각을 하면서 배열의 뒤부터 for문이 작동하도록 작성을 했다.
습관이 무서운게 원래 쓰던 방식이 아니니 뒤에서부터 시작하는 for문을 쓰면서 좀 헷갈렸다.

이후 해당 요소가 0인지 판별하고 만약 0이라면 배열 내에서 해당 요소를 삭제했다.
이 부분이 처음에는 slice를 사용해서 잘라내는 형식으로 구현을 하고 있었는데 뭔가 생각처럼 결과가 나오지 않아서 mdn을 뒤졌는 결과...

From. MDN
slice() 메서드는 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환합니다. 원본 배열은 바뀌지 않습니다.

slice는 filter, map과 마찬가지로 새로운 배열을 반환하는 메서드였다.
어쩐지 뭔가 생각대로 출력이 안 된다고 생각했다ㅠㅠ

그 다음 생각할 수 있었는건 splice 메서드여서 splice를 사용해보았다.
많이 사용하던 메서드가 아니었지만 배열 내에 요소를 추가하고 삭제했던 기능이 있다는 건 알고 있어서 이번에 다시 익혀보았다.

이렇게 배열 내의 0을 nums.splice(i, 1)을 이용해서 삭제하고 push를 사용해서 0을 배열 뒤쪽으로 다시 넣어서 함수를 완성했다.


문제를 최대한 매일 풀고 있지만 이게 도움이 될까? 하는 생각이 종종 들 때가 있다. 바로 성과가 나오는 부분은 아니라서 더 그런 생각이 드는게 아닌가 싶다.
그래도 매번 사용하던 메서드의 새로운 점을 발견하게 되는 건 그날그날 느낄 수 있는 발전이라고 생각한다. 쉬운 부분부터 한 걸음씩 해보라는 이야기가 많았는데 문제를 풀기 시작하기를 잘 한 것같다.

좋은 웹페이지 즐겨찾기