문제 링크
풀이
구현만 잘하면 되는 문제다.
수를 더할 때 맨 뒤에서부터 더하기 때문에 구현의 편의를 위해 입력받은 이진수를 둘 다 뒤집고 앞에서부터 연산하며 정답이 될 수의 앞부터 채워나갔다. 그런 후 최종 정답은 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 |