[프로그래머스] 이진 변환 반복하기
Programmers - [월간 코드 챌린지 시즌1] 이진 변환 반복하기
사용 언어 - C++
소요 시간 - 약 55분
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/70129
문제 요약
- 주어진 이진 문자열에서 0을 제거
- 0이 제거된 이진 문자열의 길이를 다시 이진 변환
- 문자열이 “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로 다시 돌아와야겠다