https://leetcode.com/problems/move-zeroes/

0을 뒤로 다 옮긴다.

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

직관적으로는 0을 옮기면 되겠네 하겠지만, 그렇게 되면 process가 길어진다.

항상 0을 가리키는 ptr하나와 0이 아닌 수를 찾는 ptr 하나를 가지고 해결한다.

class Solution {
public:
	void moveZeroes(vector<int>& nums) {
		auto first = nums.begin(); // 0만 가리킨다.
		auto second = nums.begin(); // 0이 아닌 수를 찾아 이동한다.
		for (int i = 0; i < nums.size(); i++)
		{
			if (*second == 0)
			{
				second++;  // 0이면 한칸 뒤로 옮겨준다.
			}
			else
			{
				int temp = *first;
				*first = *second;
				*second = temp;
				second++;
			}
			if (*first != 0) // 0이 아닐때만 움직여 준다.
			{
				first++;
			}
		}
	}
};

다음과 같은 결과를 얻었다.

Runtime: 4 ms, faster than 98.11% of C++ online submissions for Move Zeroes.

Memory Usage: 9 MB, less than 98.51% of C++ online submissions for Move Zeroes.

다른 방식이다. first에 second를 copy하고 끝나면 나머지를 전부 0으로 바꿔준다.

class Solution {
public:
	void moveZeroes(vector<int>& nums) {
		auto first = nums.begin();
		auto second = nums.begin();
		for (int i = 0; i < nums.size(); i++)
		{
			if (*second == 0)
			{
				second++;
			}
			else
			{
				*first = *second;
				first++;
				second++;
			}
		}
		for (first; first != nums.end(); first++)
			*first = 0;
	}
};

비슷한 결과를 얻었다.

Runtime: 4 ms, faster than 98.11% of C++ online submissions for Move Zeroes.

Memory Usage: 8.9 MB, less than 99.12% of C++ online submissions for Move Zeroes.

마지막 for문을 뭔가로 못바꾸려나...