본문 바로가기

백준/C++

[Baekjoon/C++] 1252번 이진수 덧셈

Baekjoon Online Judge

문제로 이동

 

문제

두 개의 이진수를 입력받아 이를 더하는 프로그램을 작성하시오.

 

입력

첫째 줄에 두 개의 이진수가 빈 칸을 사이에 두고 주어진다. 각 이진수는 1 또는 0으로만 이루어져 있으며, 0으로 시작할 수도 있다. 또한 각 이진수의 길이는 80을 넘지 않는다.

 

출력

첫째 줄에 이진수 덧셈 결과를 출력한다. 결과가 0인 경우를 제외하고는 출력되는 이진수는 항상 1로 시작해야 한다.

 


예제 입력 예제 출력
1001101 10010 1011111

풀이

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main() {
    string a, b;
    cin >> a >> b;

    int num[160] = {};
    bool isZero = false;

    // 두 이진수 중 더 긴 것을 a에 저장한다.
    if (a.length() < b.length()) {
        string c = a;
        a = b;
        b = c;
    }

    // 계산하기 편하게 하기 위해 배열을 뒤집는다.
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());

    int idx = a.length();

    // 이진수 덧셈
    for (int i = 0; i < a.length(); i++) {
        if (i < b.length())
            num[i] += (a[i] - '0') + (b[i] - '0');
        else
            num[i] += (a[i] - '0');

        
        if (num[i] != 0)
            isZero = true;

        // 받아올림
        if (num[i] >= 2) {
            num[i] -= 2;
            num[i + 1]++;

            if (i == a.length() - 1) idx++;
        }
    }

    // 출력
    // 답이 0인지 확인한다.
    if (isZero == false)
        cout << "0\n";
    else {
        // 필요 없는 0 제거하기 위한 변수
        bool start = false;

        // 출력
        for (int i = idx - 1; i >= 0; i--) {
            if (num[i] == 1)
                start = true;

            if (start == true)
                printf("%d", num[i]);
        }
    }

    return 0;
}

입력되는 이진수의 길이가 길기 때문에 입력값을 string으로 받았다.

이진수의 계산을 편하게 하기 위해 두 수 중 길이가 긴 수를 a에 저장하고 reverse()를 이용해 문자열을 뒤집었다.

char - '0'을 하면 char이 int로 바뀐다는 점을 사용하여 입력받은 문자열을 서로 더한 뒤 num[i]에 저장했다.

 

 if (num[i] != 0)
            isZero = true;

0000 000000과 같은 테스트 케이스가 000000과 같은 결과로 출력되지 않고 0으로 출력되게끔 하기 위한 부분이다.

 

// 받아올림
        if (num[i] >= 2) {
            num[i] -= 2;
            num[i + 1]++;

            if (i == a.length() - 1) idx++;
        }

덧셈을 하다가 받아올릴 수가 발생하면 이를 처리하는 부분이다. 계산의 마지막 부분에서 받아올림이 발생했을 때 답의 길이를 바뀌기 위한 부분도 포함되어 있다.

 

// 출력
    // 답이 0인지 확인한다.
    if (isZero == false)
        cout << "0\n";
    else {
        // 필요 없는 0 제거하기 위한 변수
        bool start = false;

        // 출력
        for (int i = idx - 1; i >= 0; i--) {
            if (num[i] == 1)
                start = true;

            if (start == true)
                printf("%d", num[i]);
        }
    }

계산 후에 답을 출력하는 부분이다.  00001이나 00000과 같은 결과를 1이나 0과 같이 출력하도록 하였다.

'백준 > C++' 카테고리의 다른 글

[Baekjoon/C++] 1264번 모음의 개수  (0) 2022.05.06
[Baekjoon/C++] 1259번 팰린드롬수  (0) 2022.05.06
[Baekjoon/C++] 성 지키기 1236번  (0) 2022.04.29
[Baekjoon/C++] 주사위 1233번  (0) 2022.04.29
[Baekjoon/C++] 이상한 곱셈 1225번  (0) 2022.04.29