본문으로 바로가기

프로그래머스 - 이진 변환 반복하기

category 프로그래머스 2021. 4. 19. 22:53

출처 : programmers.co.kr/learn/courses/30/lessons/70129

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

 

고려사항

  • 따로 메소드를 분리하여, 문자열에서 '0'을 제외하는 메소드 ( '1' 일때만 ret에 담아 반환한다 )
    문자열의 길이를 입력받아 2진법으로 변환하여 반환 ( reverse 사용 ) 정의해주었다.
  • 사라진 0의 수는 단순하게 이전 문자열 길이와 0을 제거한 새 문자열의 길이의 차로 구했다.

 

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

string lenToBinary(int len){
    string ret;
    while(len != 0){
        ret.push_back(len % 2 + '0');
        len /= 2;
    }
    
    reverse(ret.begin(), ret.end());
    return ret;
}

string removeZero(string s){
    string ret;
    for(char c : s){
        if(c == '1'){
            ret.push_back(c);
        }
    }
    
    return ret;
}

vector<int> solution(string s) {
    vector<int> answer;
    string ret;
    int cntR = 0, cntZ = 0;
    int prevLen, curLen;
    
    while(s != "1"){
        prevLen = s.size();
        s = removeZero(s);
        curLen = s.size();
        
        s = lenToBinary(curLen);
        ++cntR;
        cntZ += prevLen - curLen;
    }
    
    answer.push_back(cntR);
    answer.push_back(cntZ);
    return answer;
}