자기개발/코딩테스트
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};
}