article thumbnail image
Published 2021. 10. 19. 17:46

이진수 덧셈

문제 링크

http://icpc.me/2729

 

2729번: 이진수 덧셈

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

www.acmicpc.net

풀이

구현만 잘하면 되는 문제다.

수를 더할 때 맨 뒤에서부터 더하기 때문에 구현의 편의를 위해 입력받은 이진수를 둘 다 뒤집고 앞에서부터 연산하며 정답이 될 수의 앞부터 채워나갔다. 그런 후 최종 정답은 reverse를 했다.

그리고 문제 조건에 앞에 불필요한 0이 붙으면 안 된다는 조건 때문에 출력을 1을 발견했을 때부터 하고, 만약 다 끝까지 1이 발견되지 않는다면 값이 0이기 때문에 0을 출력한다. 이 부분을 놓쳐 2번 틀렸다.

코드

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    int t; cin >> t;
    while (t--) {
        string a, b; cin >> a >> b;
        // 구현의 편의를 위해 항상 a의 길이가 더 길게 한다.
        if (b.size() > a.size()) swap(a, b);
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        
        string ans;
        int carry = 0;
        for (int i = 0; i < b.size(); i++) {
            int sum = (a[i] - '0') + (b[i] - '0') + carry;
            if (sum > 1) carry = 1;
            else carry = 0;
            ans.push_back((sum % 2) + '0');
        }
        for (int i = b.size(); i < a.size(); i++) {
            int sum = (a[i] - '0') + carry;
            if (sum > 1) carry = 1;
            else carry = 0;
            ans.push_back((sum % 2) + '0');
        }
        
        // 모든 연산이 끝나고 carry가 남았을 때
        if (carry) ans.push_back('1');
        reverse(ans.begin(), ans.end());
        
        bool flag = false;
        for (auto &c : ans) {
            if (c == '1') flag = true;
            if (flag) cout << c;
        }
        if (!flag) cout << '0';
        cout << "\n";
    }
}

 

'Algorithm > BOJ' 카테고리의 다른 글

백준[23247] Ten  (0) 2021.10.20
백준[20168] 골목 대장 호석 - 기능성  (0) 2021.10.20
백준[1374] 강의실  (0) 2021.10.16
백준[18429] 근손실  (0) 2021.10.16
백준[16507] 어두운 건 무서워  (0) 2021.10.15
복사했습니다!