문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/70129?language=cpp
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 설명]
다음 문제에서는 0과 1로 이루어진 어떤 문자열 x가 매개변수로 주어진다. x가 1이 될 때까지 이진 변환을 수행할 때의 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하라.

[문제 풀이]
주어진 이진 변환 과정에 맞게 코드를 작성하면 되는 문제였다.
1. 문자열에서 1의 개수, 0의 개수 세기
2. 10진수로 표현된 1의 개수를 2진수로 변환하기(binary 함수)
3. 문자열의 길이가 1이 될 때까지 반복하기
[어려웠던 점]
• 처음에 큐 pair를 사용할까 했는데 문제에 answer이 vector로 나와있기도 하고 굳이 사용할 이유가 없어서 조금 시도하다가 관뒀다.
• 중간에 segmentation fault (core dumped) 에러가 났었는데 벡터를 초기화 시키지 않고 벡터의 요소를 사용해서 일어난 오류였다.
• 십진수를 이진수로 변환할 때 마지막 몫까지 추가해야 하는데 이를 해주지 않아서 조금 오래 걸렸다. 출력해보고 이를 깨달았다. (+ size를 변환시켜주는 것을 깜빡함)
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string binary(int num){
string str = "";
while(num != 1){
str += num % 2 + '0';
num = num / 2;
}
str += "1";
reverse(str.begin(), str.end());
return str;
}
vector<int> solution(string s) {
vector<int> answer(2);
int size = s.size();
while(size != 1){
int c_size = 0;
int zero = 0;
for(int i=0; i<size; i++){
if(s[i] == '1')
c_size++;
else
zero++;
}
answer[1] += zero; // 제거한 0의 개수
answer[0]++; // 이진 변환을 가하는 횟수
s = binary(c_size);
size = s.size();
}
return answer;
}