•
문제 링크 : LeetCodeMove Zeroes - LeetCode
•
문제 설명 : 0과 다른 숫자들이 존재하는 배열이 주어졌을 때, 0을 모두 뒤로 보내고 다른 숫자들의 순서는 유지된 배열로 swap 처리
•
풀이 방법
◦
처음에는 단순한 swap 이라고 생각했지만, 나머지 숫자의 순서도 변하면 안되기 때문에 조금 더 생각을 했었다.
◦
가장 중요한 것은 0을 전부 뒤쪽으로 보내는 것이기 때문에, 0을 찾는 커서가 다른 숫자를 찾는 커서를 앞지르면 안되는 것이었다.
◦
투 포인트를 가장 잘 나타낸 문제가 아닐까 생각이 들었다.
▪
풀고나니 간단했지만 방법을 떠올리기까지는 생각보다 많은 시간을 소요했다.
•
시간복잡도 :
•
성공 코드
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
복사