안녕 세상아,

[프로그래머스/c++] Lv2 이진 변환 반복하기 본문

프로그래머스

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

돈 많은 백수가 되고싶다 2024. 8. 20. 17:26

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

 

프로그래머스

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

programmers.co.kr

처음으로 챗지피티씨를 사용해서 풀어보았다..ㅋㅋ

분명 내가 한게 맞다고 생각했는데 하나씩 자꾸 틀리길래..

근데 진짜 좋은게 내가 어디가 잘못됐고 뭐가 문제인지 자세히 알려주고 다른 방법으로도 알려주고,,역시 챗지피티는 천재야

 

 

암튼 푼 방법

1. 우선 숫자를 2진수로 바꿔주기 위해 함수를 따로 만든다. 

 1-1. n이 0일 경우 예외를 둬서 예외처리를 해준다. 

 1-2. n이 0이 될때까지 나머지를 더하고 2로 나누게 된다. 

 1-3. 반대로 더해졌기 때문에 reverse문을 사용한다. (algorithm 헤더 필요)

2. s가 "1"이 될 때까지 while문을 돌린다. 

3. 0을 지워야하기 때문에 0을 만나면 answer[1]++ 해주고 erase를 사용하여 지워준다. 

 3-1. erase를 하면 문자 하나가 없어지기 때문에 i-- 를 해준다. 

4. 0이 아니면 continue (안해도됨)

5. 0을 지운 후 길이를 측정하고 1에서 만들어둔 change 함수에 넣어서 2진수로 만든다. 

6. change 함수에 넣을 때마다 answer[0]++ 해준다.

 

끝!

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string change(int n){
    if(n==0)
        return "0";
    string bit="";
    
    while(n != 0){
        bit += to_string(n % 2);
        n = n / 2;
    }
    reverse(bit.begin(),bit.end());
    
    return bit;
}
vector<int> solution(string s) {
    vector<int> answer(2,0);
    
    while(s != "1"){
        for(int i=0; i<s.size(); i++){
            if(s[i] == '0'){
                answer[1]++;
                s.erase(i,1);
                i--;
            }
            else 
                continue;
        }
        int x = s.length();
        s = change(x);
        answer[0]++;
    }
    return answer;
}