Search

Move Zeroes

문제 설명 : 0과 다른 숫자들이 존재하는 배열이 주어졌을 때, 0을 모두 뒤로 보내고 다른 숫자들의 순서는 유지된 배열로 swap 처리
풀이 방법
처음에는 단순한 swap 이라고 생각했지만, 나머지 숫자의 순서도 변하면 안되기 때문에 조금 더 생각을 했었다.
가장 중요한 것은 0을 전부 뒤쪽으로 보내는 것이기 때문에, 0을 찾는 커서가 다른 숫자를 찾는 커서를 앞지르면 안되는 것이었다.
투 포인트를 가장 잘 나타낸 문제가 아닐까 생각이 들었다.
풀고나니 간단했지만 방법을 떠올리기까지는 생각보다 많은 시간을 소요했다.
시간복잡도 : O(N)O(N)
성공 코드
class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ # 0이 존재하는 인덱스를 탐색하는 커서 zero_cursor = 0 # 0이 아닌 인덱스를 탐색하는 커서 not_zero_cursor = 0 # 두 커서가 모두 배열 범위 내 있을 때 # while문 이지만, 커서 중 하나라도 범위를 벗어나면 종료이기 때문에 O(N)이다. while zero_cursor < len(nums) and not_zero_cursor < len(nums): # 1. 0을 찾는 인덱스가 0 # 2. 0이 아닌 숫자가 있는 인덱스의 값이 실제 0이 아닌 경우 # 3. swap을 했을 때 0이 뒤로 가야하기 때문에, 0을 찾는 인덱스가 0이 아닌 인덱스보다 작아야한다. if nums[zero_cursor] == 0 and nums[not_zero_cursor] != 0 and not_zero_cursor > zero_cursor: nums[zero_cursor], nums[not_zero_cursor] = nums[not_zero_cursor], nums[zero_cursor] # 0을 찾는 인덱스가 0이 아닌 경우에만 0을 찾기 위해 증가 if nums[zero_cursor] != 0: zero_cursor += 1 # 0이 아닌 인덱스는 swap을 여부에 상관 없이 무조건 증가 not_zero_cursor += 1
Python
복사