PS/문자열 알고리즘[String]

백준 15353 큰 수 A+B(c++)

SeungbeomKim 2022. 7. 12. 15:16

https://www.acmicpc.net/problem/15353

 

15353번: 큰 수 A+B (2)

C++17, C11, C99, C++98, C++11, C++14, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

<코드>

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;

int main()
{
	string a,b;
	cin>>a>>b;
	deque<int>v1;
	deque<int>v2;
	vector<int>ans;
	vector<int>::iterator it;
	for(int i=0;i<a.size();i++)
	{
		v1.push_back(a[i]-'0');
	}
	for(int i=0;i<b.size();i++)
	{
		v2.push_back(b[i]-'0');
	}
	int len = v1.size()>v2.size()?v1.size():v2.size();
	if(v1.size()>v2.size())
	{
	for(int i=0;i<v1.size()-v2.size();i++)
	{
		v2.push_front(0);	
	}
	}
	else if(v1.size()<v2.size())
	{
	for(int i=0;i<v2.size()-v1.size();i++)
	{
		v1.push_front(0);	
	}
	}
	reverse(v2.begin(),v2.end());
	reverse(v1.begin(),v1.end());
	
	int carry = 0;
	for(int i=0;i<len;i++)
	{
		if(v1[i]+v2[i]+carry>=10)
		{
			ans.push_back((v1[i]+v2[i]+carry)%10);
			carry = 1;
		}
		else{
			ans.push_back(v1[i]+v2[i]+carry);
			carry = 0;		
		}
	}
	if(carry) ans.push_back(carry);
	reverse(ans.begin(),ans.end());
	for(auto it=ans.begin();it!=ans.end();it++)
	{
		cout<<(*it);
	}
	
}

<풀이 과정>

큰 수 덧셈인데 정수형 int나 long long으로는 큰 수를 표현하기엔 한계가 있다(왜냐하면 A,B의 자리수가 10^10000이기 때문이다) 

그래서 생각한 방법은 큰 수 두 개를 문자열로 선언하는 것이다. 

선언한 후 a,b의 자릿수에 따라서 ex) 1234 1 이면 1234 0001 를 만들어주고, 1 1234이면, 0001 1234를 만들어준다.

자리수를 같게 해줘야 연산이 가능하기 때문이다.

나는 deque를 사용해서 풀었는데, deque를 사용하면 앞,뒤로 원소를 추가할 수 있기 때문이다(이 경우에선 앞에 원소를 추가하기 위함)

그리고 연산은 마지막 원소부터 해야하기 때문에, reverse함수를 이용해 자리를 바꿔주었다.