1. 문제
15740번: A+B - 9
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B (-1010000 ≤ A, B ≤ 1010000)가 주어진다.
출력
첫째 줄에 A+B를 출력한다.
2. 소스코드
1회차 - 20/05/05
- 이게 브론즈5 문제라니. 기본기가 많이 부족한가보다.
- 크기가 다르다면 자릿수를 0으로 채우고, 음수인경우 무조건 큰 수에서 작은 수를 뺐다.
- 큰 수를 구하는 로직을 너무 허술하게 세워 계속 틀렸음.
- 파이썬을 이용하면 금방풀린다는데, 파이썬을 몰라서 C++로 풀었다.
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
string A, B;
vector<char> first;
vector<char> second;
stack<int> res;
int main() {
cin >> A >> B;
bool positA = true;
bool positB = true;
int idxA = 0, idxB = 0;
if (A[0] == '-') {
positA = false; A = A.substr(1,A.size());
}
if (B[0] == '-') {
positB = false; B = B.substr(1,B.size());
}
//빈 자리수를 0으로 채워준다.
int diff = A.size() - B.size();
if (diff < 0) { // A가 더 적음.
diff *= -1;
for (int i = 0; i < diff; ++i) {//0으로 자리수를 채워주겠음.
first.push_back('0'); ++idxA; //0으로 채운만큼 빈칸 인덱스를 늘린다.
}
}
else {
for (int i = 0; i < diff; ++i) {//0으로 자리수를 채워주겠음.
second.push_back('0'); ++idxB;
}
}
for (char ch : A) first.push_back(ch);
for (char ch : B) second.push_back(ch);
// 어느게 더 큰수인가?
bool AisBig = false, BisBig = false, isSame = true;
if (first.size() - idxA != second.size() - idxB) isSame = false;
else {
for (int i = 0; i < min(first.size() - idxA, second.size() - idxB); ++i) {
if (first[i + idxA] != second[i + idxB]) isSame = false;
}
}
if (!isSame) {
if (A.size() > B.size()) {// A가 길면 당연히 A가 크다.
AisBig = true; BisBig = false;
}
else if (A.size() < B.size()) {// B가 길면 B가 크다.
AisBig = false; BisBig = true;
}
else {//but 길이가 같은 경우
bool check;
for (int i = 0; i < first.size() - idxA; ++i) {
if (first[i] - '0' < second[i] - '0')
{
check = false;
break;
}
else if (first[i] - '0' > second[i] - '0') {
check = true;
break;
}
}
if (check) { AisBig = true; BisBig = false; }
else { AisBig = false; BisBig = true; }
}
}
if ((positA and positB) or (!positA and !positB)) {
int carry = 0;
for (int i = first.size() - 1; i >= 0; --i) {// 뒷자리부터 자리수를 순회하면서
int temp = (first[i] - '0') + (second[i] - '0');
if (carry) temp += carry--;
if (temp > 9) {
++carry;
temp -= 10;
}
res.push(temp);
}
if (carry) res.push(carry);
}
else {
int desc = 0;
for (int i = first.size() - 1; i >= 0; --i) {// 뒷자리부터 자리수를 순회하면서
int temp;
if (AisBig or isSame) {// 앞이 큰 경우 같아도 그냥 앞부터 한다.
temp = (first[i] - '0') - (second[i] - '0');
}
else temp = (second[i] - '0') - (first[i] - '0');
if (desc) temp -= desc--;
if (temp < 0) { // 음수가 되버린경우
++desc;
temp += 10;
}
res.push(temp);
}
}
//기호를 붙여준다.
if (positA == false and positB == false) cout << '-'; // 둘다 음수인경우 -
else if (isSame);
else if (AisBig and positA == false) cout << '-'; //A가 더 큰데 음수인경우.
else if (BisBig and positB == false) cout << '-'; //B가 더 큰데 음수인경우.
bool isNull = true;
while (!res.empty())
{
int temp = res.top();
if (res.size() == 1 and isNull and temp == 0) cout << 0;
else if (isNull and temp == 0);
else {
isNull = false; cout << temp;
}
res.pop();
}
return 0;
}
'알고리즘 > BOJ(백준)' 카테고리의 다른 글
[ 백준 - 14500번 / 구현 ] 테트로미노 (삼성기출) (0) | 2020.05.11 |
---|---|
[ 백준-7569번 / 완전탐색 ] 토마토 (0) | 2020.05.05 |
[ 백준 - 3954번 / 구현 ] Brainf**k 인터프리터 (삼성기출) (0) | 2020.05.02 |
[ 백준-17472번 / 그래프 / MST / 완전탐색 ] 다리만들기2 (0) | 2020.04.29 |
[ 백준-17136번 / 완전탐색 / 백트레킹 ] 색종이 붙이기 (0) | 2020.04.28 |