알고리즘/프로그래머스 2단계

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

게임만드는학생 2024. 7. 30. 12:33

https://school.programmers.co.kr/learn/courses/30/lessons/70129

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    
    int convCnt=0;
    int eraseZero=0;
    
    while(s!="1")
    {
        int len=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]!='0')len++;
            else eraseZero++;
        }
    
        int num = len;
        string con;
        while(num>0)
        {
            con+=(num%2)+'0';
            num/=2;
        }
        // string reverse
        for(int i=0;i<con.length()/2;i++)
        {
            char c = con[i];
            con[i]= con[con.length()-1-i];
            con[con.length()-1-i]=c;
        }
        s=con;
        convCnt++;
    }
    answer.push_back(convCnt);
    answer.push_back(eraseZero);
    return answer;
}

 

이진 변환 반복을 통해 문자열이 "1"이 될 때까지 반복해서 0이 지워진 개수와 총 몇번 변환됐는지를 리턴하는 문제이다.

 

규칙은 다음과 같다.

1. 문자열에서 0을 지운다.

2. 새로운 문자열의 개수를 c라고 할 때, c를 이진수로 변환해서 문자열로 만든다.

3. 문자열이 "1" 아니면 다시 1번부터 반복한다.

 

while문을 통해 "1"인지 판단하고 반복문을 통해 1과 0의 개수를 세서 변수에 저장하고 

con 변수에 이진수로 바꾼 문자열을 저장한다.

나머지연산을 통해 만든 이진수는 거꾸로 저장되기 때문에 문자열을 뒤집어주고 s에 다시 저장한다.