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 |