- Date : 2021.08.22(일)
- Time : 15분
- 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.
- 1 <= nums.length <= 10^4 -2^31 <= nums[i] <= 2^31 - 1
- Input: nums = [0,1,0,3,12]
- Output: [1,3,12,0,0]
def moveZeroes(self, nums: List[int]) -> None:
nums[:] = [i for i in nums if i != 0] + [0] * nums.count(0)
return nums
: 최대한 코드를 한 줄로 줄이는 연습을 할 수 있었던 문제. 사실 문제는 쉬웠다. 배열의 값이 0이 아니라면 그 순서를 유지하면서 앞으로 이동하고, 0이라면 뒤로 이동시키는 방식이다. 이 방법은 탐색으로 검사를 하면서 0이면 삭제 후 뒤에 append 시킬 수도 있다. 하지만 나는 nums를 for문으로 검사하면서 0이 아닌 것들만 먼저 배열로 생성 후 그 뒤에 0의 갯수를 count로 검사해 붙여주었다. 여기서 포인트는 nums = 이 아니라 nums[:] = 이라는 것
이다. 문제의 조건중에 array의 복사본을 만들지 말라는 얘기가 나온다. 만약 nums =
으로 코드를 구성했다면 이것은 복사본이 만들어지는 경우이다. 우리는 원래의 nums가 수정되기를 바라지만 새로운 nums가 메모리에 저장
된다. 그렇기 때문에 nums[:]를 통해서 nums의 전체 리스트 요소를 가져와주고 그 부분을 수정해줘야한다.