[프로그래머스/C++]Lv.0 - 이진수 더하기

YH J·2023년 4월 21일
0

프로그래머스

목록 보기
70/168

문제 링크

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

시도한 방법

  1. stoi로 이진수를 숫자로 바꾼 뒤 더해가면서 계산 -> 오버플로우로 실패
  2. 받은 이진수 문자열을 int형 벡터에 옮겨담은 뒤 한자리 한자리마다 계산해서
    결과를 저장한 뒤 string으로 옮겨주기 -> 성공인데 주먹구구식
    vector로 옮김 -> 계산 -> string으로 옮기기 -> 완성한 문자열에서 앞자리 0을 다 제거 , answer 가 0인경우 따로 0 문자 추가

내 코드

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

using namespace std;

vector<int> ToArr(vector<int> inArr, string inBin)
{
    for(int i = inArr.size() - inBin.size();i < inArr.size();i++)
    {
        inArr[i] = inBin[i - inArr.size() + inBin.size()] - '0';
    }
    return inArr;
};

string solution(string bin1, string bin2) {
    string answer = "";
    
    vector<int> arr1(11,0);
    vector<int> arr2(11,0);
    
    arr1 = ToArr(arr1,bin1);
    arr2 = ToArr(arr2,bin2);
    
    vector<int> arr3;
    int over = 0;
    
    for(int i = arr1.size() - 1; i >= 0; i--)
    {
        int a = arr1[i] + arr2[i] + over;
        over = 0;
        if(a == 3)
        {
            arr3.push_back(1);
            over = 1;
        }
        else if(a == 2)
        {
            arr3.push_back(0);
            over = 1;
        }
        else if(a == 1)
            arr3.push_back(1);
        else
            arr3.push_back(0);
    }
    if(over)
        arr3.push_back(1);
    
    for(int i = arr3.size() - 1; i >= 0; i--)
    {
        answer += to_string(arr3[i]);
    }
    if(answer[0] == '0')
        answer.erase(0, answer.find("1"));
    if(answer.size() == 0)
        answer += '0';
    return answer;
}

다른 사람의 풀이 1

#include <bits/stdc++.h>
using namespace std;

string solution(string bin1, string bin2) {
    int a = 0, b = 0;
    for (auto ch : bin1) a = a << 1 | ch - 48;
    for (auto ch : bin2) b = b << 1 | ch - 48;

    string ret;
    for (int n = a + b; n; n >>= 1) ret = char(n % 2 + 48) + ret;

    return ret.empty() ? "0" : ret;
}

다른 사람의 풀이 해석 1

이진수 문자열을 십진수 int로 바꾼 뒤 더하고 n % 2 -> 사실상 이진수의 1의자리 숫자 -> n % 2 + 48 -> 이진수의 1의자리 숫자를 char형으로 만든것.
char 에 ret을 더해주므로 왼쪽으로 char가 쌓여간다. 마지막으로 return 할 때 empty를 체크해서 0을 반환하거나 ret 을 반환해준다.

다른 사람의 풀이 2

#include <string>
#include <vector>
#include <bitset>
using namespace std;

string solution(string bin1, string bin2) {
    auto tmp = bitset<32>(bitset<32>(bin1).to_ulong() + bitset<32>(bin2).to_ulong()).to_string();

    int ind = 0;
    while(tmp[ind] == '0')
    {
        ind++;
    }
    if(ind == tmp.size())
    {
        ind--;
    }
    return tmp.substr(ind);
}

다른 사람의 풀이 해석 2

bitset 을 이용하여 두 이진수를 더해준다.
그 후 while문을 돌려서 앞자리 0의 범위를 구해준 뒤 tmp에서 그 부분을 제거해준다.

profile
게임 개발자 지망생

0개의 댓글