문제 풀이/Programmers 문제 풀이

[Programmers 알고리즘, C++]#Level2_이진 변환 반복하기

Hardii2 2022. 9. 25. 20:09

 

[Programmers 알고리즘, C++]#Level 2_이진 변환 반복하기

Programmers 알고리즘 문제 풀이, Level 2_이진 변환 반복하기

이진 변환 알고리즘과 STL 알고리즘을 활용하여 풀이하는 문제입니다.

 


 

문제

출저: Programmers Level 2 이진 변환 반복 문제

 

풀이
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool Pred(char c)
{
    return c == '0';
}

vector<int> solution(string s) {
    vector<int> answer;
    
    int delete0Cnt = 0;
    int decToBinCnt = 0;
    
    vector<int> tmpV;
    
    while(s != "1")
    {
        // 1. 0 제거, for 문을 돌면서 삭제하면 String에 직접적인 변화
        for(int i=0; i<s.size(); i++)
        {
            if(s[i] == '0')
            {
                ++delete0Cnt;
            }
        }
        
        auto it = remove_if(begin(s), end(s), Pred);
        s.erase(it, end(s));
        
        // 2. size 길이 -> 이진 변환
        int n = (int)s.size();
        while(n>0)
        {
            int tmp = n%2;
            tmpV.push_back(tmp);
            
            n /= 2;
        }
        
        string str = "";
        for(int i=0; i<tmpV.size(); i++)
        {
            str += (tmpV[i]+'0');
        }
        
        s = str;
        
        decToBinCnt++;
        tmpV.clear();
    }
    
    answer.push_back(decToBinCnt);
    answer.push_back(delete0Cnt);
    
    return answer;
}
1. 이진 변환 알고리즘
while(n>0)
{
    int tmp = n%2;
    tmpV.push_back(tmp);
            
    n /= 2;
}​


2. erase 알고리즘

반복문을 돌며 "erase" 알고리즘을 호출하면 항목들의 이동이 발생하기 때문에 특정 항목의 삭제 작업이 제대로 진행되지 않을 수 있습니다. 따라서, remove_if(begin(v), end(v), Pred) 알고리즘을 통해 프레디킷 함수(세 번째 인자)와 합치하는 항목을 컨테이너의 뒤로 보낸 뒤에 삭제 작업을 진행해야 합니다!