정수 배열에 포함된 모든 0을 배열의 끝으로 이동해야 하는 경우 MoveZeros 메서드를 활용할 수 있습니다. 핵심 아이디어는 배열을 한 번만 순회하면서 0이 아닌 요소들을 배열 앞쪽으로 차례대로 옮긴 뒤, 나머지 빈자리를 모두 0으로 채우는 것입니다.
알고리즘 동작 원리
- 배열이 null이거나 길이가 0인 경우에는 별도의 처리 없이 즉시 반환합니다.
- 배열을 순회하면서 0이 아닌 요소를 만나면
count위치에 해당 값을 저장하고count를 하나씩 증가시킵니다. - 순회가 끝난 후
count인덱스부터 배열 끝까지의 모든 요소를 0으로 채웁니다.
최종 결과는 입력받은 nums 배열에 그대로 저장됩니다. 이 방식은 배열을 단 한 번만 순회하기 때문에 효율적이며, 별도의 추가 배열을 사용하지 않아 메모리 측면에서도 유리합니다.
시간 복잡도 – O(N)
공간 복잡도 – O(1)
예제 코드
public class Arrays {
public void MoveZeros(int[] nums) {
if (nums == null || nums.Length == 0) {
return;
}
int count = 0;
for (int i = 0; i < nums.Length; i++) {
if (nums[i] != 0) {
nums[count] = nums[i];
count++;
}
}
for (int i = count; i < nums.Length; i++) {
nums[i] = 0;
}
}
}
class Program {
static void Main(string[] args) {
int[] nums = { 0, 1, 0, 3, 12 };
Arrays arr = new Arrays();
arr.MoveZeros(nums);
Console.WriteLine("[" + string.Join(",", nums) + "]");
}
}출력 결과
[1,3,12,0,0]
위 예제처럼 입력 배열 {0, 1, 0, 3, 12}가 주어지면, 0이 아닌 값들인 1, 3, 12가 먼저 배치되고 그 뒤에 0 두 개가 이어져 최종적으로 [1, 3, 12, 0, 0]이 출력됩니다. 기존 요소들의 상대적인 순서는 유지됩니다.