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문을 뭔가로 못바꾸려나...