sleepyotter. 2022. 2. 15. 13:55

iterator를 사용하여 지우고 0의 개수를 cnt하고 뒤에 붙여준다.

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        
        int cnt = 0;
        vector<int>::iterator it=nums.begin();
        
        while(it!=nums.end())
        {
            if(*it==0)
            {
                cnt++;
                it = nums.erase(it);
            }
            else
            {
                it++;
            }
        }
        
        for(int i=0; i<cnt; ++i)
        {
            nums.push_back(0);
        }
        
        return;
    }
};

훨씬 빠른 풀이

 1 2 3 처럼 0이 없는 경우에는 제 자리에 다시 덧씌우는 형태가 될 것이고

1 0 2 0 3 0 이 되는 경우에는 1 2 3 0 3 0 이 될 것이다. idx는 3이 된 상태로 while문에 진입하여 뒤쪽의 3을 0으로 밀어버린다.

 void moveZeroes(vector<int>& nums) {
        
        int idx = 0;
        
        for (auto a: nums) if (a != 0) nums[idx++] = a;
        
        while (idx < nums.size()) nums[idx++] = 0;        
        
    }