나만의 작은 도서관

문제 70129. 이진 변환 반복하기 본문

프로그래머스 문제풀이/코드카타

문제 70129. 이진 변환 반복하기

pledge24 2024. 6. 30. 00:15

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 

난이도 :  Lv.2

 

문제 요약 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  • x의 모든 0을 제거합니다.
  • x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

입력

  • 0과 1로 이루어진 문자열 s

입력 제한

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입력 예제

// input
"110010101001"

// ans
[3,8]

 

풀이 방식

 해당 문제는 구현 유형 문제이므로, 문제에서 요구하는 대로 작성하면 된다. 따라서 아래의 과정을 1이 나올때까지 반복한다.

  • 현재 문자열 s에서 0의 개수를 cnt에 저장하고, 제거한 0의 개수 변수 cnt_zero에 cnt만큼 더한다.
  • 현재 문자열 s에서 1의 개수를 구하고(s의 길이 - 0의 개수) 1의 개수를 이진수로 변환한다.
  • while루프를 반복한 횟수를 저장하는 loop를 1증가시킨다.

while루프가 종료되면 cnt_zero와 loop를 통해 answer를 반환한다.

 

 

정답 코드 

더보기
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    
    int cnt_zero = 0, cnt, num;
    int loop = 0;
    while(s != "1"){
        cnt = 0;   
        for(char c : s){
            if(c == '0'){
                cnt++;
            }
        }
        num = s.length() - cnt;
        cnt_zero += cnt;
        
        s = "";
        while(num > 0){
            s += (num % 2) + '0';
            num /= 2;
        }
        reverse(s.begin(), s.end());
        cout << s << '\n';
        loop++;
    }
    
    answer = {loop, cnt_zero};
    return answer;
}