더보기 주의 , 코드에 관한 설명이 간략히 있지만 코드 내용 원문이 있으니 주의 할 것
<나의 풀이>
더보기
이 문제는 규칙에 의한 이진 변환시 roop 돌은 횟수와 roop를 돌면서 지운 0의 갯수를 구하는 문제이다.
<플로우 차트>
1.0 제거하기
1-1.문자열 s안에 있는 0과 1을 내림차순 정렬 하기
1-2. 문자열의 0의 첫번째 index값을 찾음
1-3. index값 반환에 성공한경우 if문 동작해서 0을 제거
2. 0을 제거한 문자열 s의 길이 체크후 이진변환
2-1. 문자열을 2로 계속 나눠서 이진 변환시키기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(string s) {
vector<int> answer;
int roop = 0; //roop를 돈 횟수
int zero_del = 0; //roop를 돌면서 지워진 0의 갯수
//s이 "1"이되면 roop 종료
while (s != "1")
{
int zero_index = 0;
//1. 0제거하기
sort(s.rbegin(), s.rend());//내림차수 정렬 ex)111100000
zero_index = s.find("0");
//0을 찾을경우 if문 동작
if (zero_index != -1)
{
zero_del += s.length() - zero_index; // 현재 roop에서 지운 0의 갯수 카운트
s.erase(s.begin() + zero_index, s.end());
//문자열의 0 첫번째 index(s.begin() + zero_index) , 문자열 끝index를 지워주면 1만 남게된다.
}
//2. 0을 제거한 s의 길이 체크후 이진변환
int zero_del_str = s.length();
s = ""; //s문자열 초기화
while (zero_del_str != 0)
{
//10진수를 2진수로 변환하는 방법
s += to_string(zero_del_str % 2);
zero_del_str /= 2;
}
reverse(s.begin(), s.end());// s문자열 원소를 뒤집어 원하는값으로 바꾸기
roop++; //1회 roop
}
return { roop,zero_del};
}
<다른사람의 풀이>
더보기
이진수를 vector<bool>값으로 나타냈으며 , 반복문 while에 들어가기전 for_each문을 사용하여 문자열s의 값을 vector<bool> 이진수 로 변경을 하였고 반복문에서 반복작업을 하였다.
#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 };
}