coding_test/BAEKJOON

백준 2729번 C++ 풀이

CodeJin 2022. 3. 21. 02:04

https://www.acmicpc.net/problem/2729

 

2729번: 이진수 덧셈

이진수 덧셈은 매우 간단하고, 십진수 덧셈과 비슷하게 하면 된다. 십진수 덧셈을 할 때는, 오른쪽부터 왼쪽으로 차례대로 숫자 하나씩 더하면 된다. 이진수 덧셈도 이와 비슷하게 하면 된다. 십

www.acmicpc.net

시간 제한 메모리 제한 solved.ac 티어
1초 128MB 실버 5

문제

이진수 덧셈은 매우 간단하고, 십진수 덧셈과 비슷하게 하면 된다. 십진수 덧셈을 할 때는, 오른쪽부터 왼쪽으로 차례대로 숫자 하나씩 더하면 된다. 이진수 덧셈도 이와 비슷하게 하면 된다. 십진수 덧셈은 외워야 할 덧셈이 많지만, 이진수 덧셈은 아래와 같이 5가지만 기억하면 된다.

  • 0 + 0 = 0
  • 1 + 0 = 1
  • 0 + 1 = 1
  • 1 + 1 = 10
  • 1 + 1 + 1 = 11

두 이진수가 주어졌을 때, 그 합을 이진수로 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 수 T(1<=T<=1,000)가 주어진다. 각 테스트 케이스는 숫자 2개로 이루어져있다. 이 숫자는 0과 1로만 이루어진 이진수이며, 길이는 최대 80자리이다. (덧셈 결과는 81자리가 될 수도 있다) 이진수는 0으로 시작할 수도 있다.

출력

각 테스트 케이스에 대해 입력으로 주어진 두 이진수의 합을 구해 이진수로 출력한다. 숫자의 앞에 불필요한 0이 붙으면 안 된다.


이진수 덧셈을 구현하는 문제. 문자열로 받아서 하나씩 더해주자.

 

덧셈은 항상 낮은 자리수부터 덧셈을 시작하기 때문에 구현의 편의상 문자열을 한번 뒤집어서 덧셈을 구현해주었다.

 

#include <bits/stdc++.h>
using namespace std;
#define ALL(it) it.begin(), it.end()

string bin1, bin2, result;

void bin_plus() {
    reverse(ALL(bin1));
    reverse(ALL(bin2));
    result.clear();
    if (bin1.length() < bin2.length()) swap(bin1, bin2); // 더 긴 숫자가 bin1

    int flag = 0;
    int i = 0;
    int temp;

    for(; i < bin2.length(); i++) {
        temp = (bin1[i] - '0') + (bin2[i] - '0') + flag;
        // 2가 넘어가면 다음자리로 1을 넘겨줘야 한다.
        if(temp >= 2) flag = 1;
        else flag = 0;
        result += (temp % 2) + '0';
    }

    for(; i < bin1.length(); i++) {
        temp = (bin1[i] - '0') + flag;
        // 이 반복문에서는 temp가 2가 최대이다.
        if(temp == 2) flag = 1;
        else flag = 0;
        result += (temp % 2) + '0';
    }

    if(flag == 1) result += '1'; // 마지막 1이 남아있다면 붙여준다
    reverse(ALL(result));
    while(*result.begin() == '0' && result.length() > 1) { // delete leading zero
        result.erase(result.begin(), result.begin() + 1);
    }
}

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int tcase;

    cin >> tcase;
    while(tcase--) {
        cin >> bin1 >> bin2;
        bin_plus();
        cout << result << '\n';
    }
}