쉬움
Move Zeroes
코드 라인과 단계 ID를 동기화하고, 변수/포인터/배열·행렬·그래프 엔티티의 상태 스냅샷을 단계마다 갱신한다.
입력
1함수 moveZeroes(nums):2 느림 = 0 // 다음 비영이 들어갈 자리3 반복 빠름 = 0 … n-1:4 만약 nums[빠름] ≠ 0:5 nums[느림] ↔ nums[빠름] // 비영을 앞으로 당김6 느림 += 1 // 자리 확정, 한 칸 전진7 반환 nums // 0은 모두 뒤로 밀림
변수
- 느림
- 0
- n
- 5
1 / 10다음 비영(0이 아닌 값)이 들어갈 자리를 느림으로 표시합니다.
느림/빠름 두 포인터로 0이 아닌 값을 앞으로 모으고, 0을 순서 보존하며 뒤로 민다.
왜 헷갈리는가
'제자리(추가 배열 없이)'와 '안정성(0이 아닌 값들의 원래 순서 유지)'을 동시에 지켜야 해서 단순 스왑으로 하면 순서가 깨진다.
핵심 아이디어
느림 포인터는 '다음에 0이 아닌 값이 들어갈 자리'를 가리킨다. 빠름이 0이 아닌 값을 만날 때마다 느림 자리로 보내고 느림을 한 칸 민다. 남은 뒤쪽은 0으로 채워진다.
복잡도
시간 O(n)·공간 O(1). 배열을 한 번만 지나며 제자리에서 처리한다.
실무에서 어디에 쓰나
'유효한 것만 앞으로, 나머지는 뒤로'는 파티셔닝의 기본형이다.
- 스파스 데이터 압축: 0/결측을 뒤로 몰아 유효 값만 연속 배치
- 가비지 컴팩션: 살아있는 객체를 앞으로 모아 메모리 조각화 해소
- 필터-후-정렬: 활성/비활성 레코드를 제자리에서 분리
- 렌더 최적화: 화면에 보이는 항목을 앞으로 모아 배치 처리
흔한 실수
순서를 지키지 않는 양끝 스왑을 쓰면 안정성이 깨진다(0 위치만 맞고 값 순서가 바뀜).
기억할 것
- 느림 = 다음 유효값 자리.
- 제자리 + 안정성 두 제약을 동시에.
- 파티셔닝의 기본 패턴.
- O(n)/O(1).