N

(프로그래머스 c++)이진 변환 반복하기 본문

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

(프로그래머스 c++)이진 변환 반복하기

naeunchan 2020. 11. 23. 16:34
728x90
반응형

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 c를 2진법으로 표현한 문자열로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 1이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.


제한사항

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

 

문자열을 다루는 문제다.

우선 s가 1이 될 때까지 while.

 

s가 문자열이기 때문에 차례대로 0의 개수를 카운팅하고,

0이 아니면 임시변수 tmp에 1을 넣어준다.

s를 순회하고 나면 tmp에는 s에서 0을 제거한 결과가 나오게 된다.

그렇다면 임시변수 num에 tmp의 길이를 저장하여 이를 2진수로 변환하면 된다.

변환할 때에는 문자열로 저장하여 s로 다시 저장하여 1이 될 때까지 반복하면 된다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer(2, 0);
    int zero = 0, round = 0;
    
    while(s != "1")
    {
        string tmp = "";
        int size = 0, num;
        round++;
        
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] == '0')
                zero++;
            else
                tmp += "1";
        }
        
        num = tmp.size();
        s = "";
        while(num > 0)
        {
            s += to_string(num % 2);
            num /= 2;
        }
    }
    
    answer[0] = round;
    answer[1] = zero;
    return answer;
}
728x90
반응형