[프로그래머스] 이진 변환 반복하기



Programmers - [월간 코드 챌린지 시즌1] 이진 변환 반복하기




사용 언어 - C++

소요 시간 - 약 55분




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/70129




문제 요약

  1. 주어진 이진 문자열에서 0을 제거
  2. 0이 제거된 이진 문자열의 길이를 다시 이진 변환
  3. 문자열이 “1”이 될 때까지 1번과 2번 반복




최종 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    
    //01110 - 111 - 11 - 10 - 1
    //answer[0] : 이진 변환 횟수
    //answer[1] : 제거된 0의 개수
    int transformCount = 0;
    int zeroCount = 0;
    
    //1. 반복 조건 설정 - 횟수 미정. 조건만 존재 s == "1"
    while(s != "1")
    {
        //0을 지우는 방법
        //지우면서 동시에 카운트도 진행해야함
        //최초 사이즈에서 0을 제거한 사이즈를 빼면 0의 개수가 나옴
        int currSize = 0;
        
        for(char c : s)
        {
            if(c == '1')
                currSize++;
        }

        zeroCount++;
        
        transformCount += s.size() - currSize;
        
        //0이빠진 s의 길이를 다시 이진수로 변환
        s = "";
        while(currSize > 0)
        {
            s += to_string(currSize % 2);
            currSize /= 2;
        }
    }
    
    answer.push_back(zeroCount);
    answer.push_back(transformCount);
    
    return answer;
}




트러블 슈팅

  • 전에 사용했던 regex_replace 함수로 풀어보려 했는데 뭐가 잘못됐는지 풀리지 않았다
    • 나중에 다시 regex_replace 함수를 사용해서 풀어보고 싶다
  • illegal instruction으로 core dump 에러가 발생했다
    • 아무생각 없이 answer 배열의 0번째, 1번째 인덱스에 직접 값을 ++하고 +=하고 있었다




문제 풀이 후 소감

  • Lv.1만 풀다가 Lv.2를 푸니까 왜 Lv.2인지 알 것 같다
  • 그 동안 40분에 맞춰서 풀다가 1시간으로 맞춰서 풀어보는데 솔직히 운이 좋아서 맞은거지, 운이 조금만 나빴어도 시간 내에 못 풀었을거라는 생각이 들었다
  • Lv.1 문제 중에 정답률이 조금 낮은 거 위주로 조금 더 실력을 기른 후에 Lv.2로 다시 돌아와야겠다