더보기 주의 , 코드에 관한 설명이 간략히 있지만 코드 내용 원문이 있으니 주의 할 것

 

<나의 풀이>

더보기

이 문제는 규칙에 의한 이진 변환시 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 };
}

+ Recent posts