자기개발/코딩테스트

C++ (코딩테스트) - 이진 변환 반복하기(프로그래머스)

pi92 2022. 9. 29. 14:26

문제

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

 

프로그래머스

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

programmers.co.kr

 

내코드 

 

#include <string>
#include <vector>

using namespace std;


bool m_function(int& re_cnt, int& zero_cnt, int& size)
{
    int m_size = 0;
    while (size != 1)
    {
        if (size % 2) m_size++;     
        else zero_cnt++;        
        size /= 2;
        if (size == 1) m_size++;
    }
    size = m_size;
    re_cnt++;
    if (size == 1) return false;
    return true;
}

vector<int> solution(string s) {
    vector<int> answer(2,0);

    if (s.size() == 1) return answer;
    int one_size = 0;
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] == '0') answer[1]++;
        else one_size++;
    }
    answer[0]++;
    if (one_size == 1) return answer;
    while (m_function(answer[0], answer[1], one_size));

    return answer;
}

다른사람 풀이

 

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

vector<int> solution(string s) {
    int zeros{0}, num_transform{0}; vector<bool> bin;
    for_each(s.cbegin(),s.cend(),[&bin](const char c){bin.emplace_back(c=='1');});  //s를 이진수로 변환
    while(true){
        if(bin==vector<bool>{true}) break;
        int ones = count(bin.cbegin(),bin.cend(),true);    //1갯수를 셈
        zeros += bin.size()-ones;                          //0갯수를 셈
        bin.clear();
        while(ones>0){ bin.emplace_back(ones%2); ones/=2; }//1갯수를 2진수로 바꿈. 순서는 거꾸로지만 계산에는 영향없음
        ++num_transform;                                   //이진변환 횟수 기록
    }
    return {num_transform,zeros};
}