[PS] 이진 변환 반복하기

강건우·2026년 9월 24일

[programmers]

목록 보기
5/14

문제

해결

문자열을 순회하면서 0이면 0개수에 ++ , 1이면 그걸 새로운 문자열에 넣기. 그렇게 해서 새로 나온 문자열의 길이를 이진수로 변환해주는 함수 하나만 작성하면 된다.

이 문제를 원활하게 풀려면 십진수 -> 이진수로 변환하는 과정에 대해서 잘 알아야 하는데, 학교 전공 과목으로 이산수학을 들었다면 알고 있을 것이다.

특정 수를 2로 나누면서 몫이 0이 나올 때 까지의 나머지를 역으로 올라가면서 이진수를 구성하면 된다.

소스코드

#include <string>
#include <vector>

using namespace std;

string TurnLengthToBin(int len)
{
    string ret = "";
    while(len != 0)
    {
        if(len % 2 != 0) ret += "1";
        else ret += "0";
        len /= 2;
    }
    return ret;
}

vector<int> solution(string s) {
    vector<int> answer(2, 0);
    // s가 "1"이 될 때 까지 아래 구문을 반복
    while(s != "1")
    {
        string newStr = "";
        // 기존 문자열에서 0 제거
        for(char c : s)
        {
            if(c == '1') newStr += "1"; //1이면 새 문자열에 더함.
            else { ++answer[1];} // 아니면 제거된 0의 개수 더하기
        }
        s = TurnLengthToBin(newStr.length()); // 새로 나온 문자열을 기존 문자열에 덮어 씌우기
        ++answer[0];
    }
    return answer;
}
profile
잠시 숨을 고르는 청년

0개의 댓글