본문 바로가기
알고리즘/BOJ(백준)

[ 백준-15740번 / 큰 수 연산 ] A+B - 9

by 뎁꼼 2020. 5. 5.

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;
}