본문 바로가기

알고리즘

[백준 알고리즘 c++] 문제 13. 두수의 합(배열) 10757

반응형

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

출력
첫째 줄에 A+B를 출력한다.

예제 입력 1
9223372036854775807 9223372036854775808
예제 출력 1
18446744073709551615

내 풀이)

#include <iostream>

using namespace std;

//10의 10만승은 10001임 10^2 => 100이므로 3자리수가됨
char A[10001] = { 0 };
char B[10001] = { 0 };
char C[10001] = { 0 };
char a_alpha[10001] = { 0 };
char b_alpha[10001] = { 0 };

int main()
{

	/*
		문제
			1. 두 정수의 합을 출력
		입력
			1. 두 정수를 배열형태로 입력받는다.
		처리
			1. 입력 받은 배열을 올림하는 방식으로 더해준다.
		출력
	*/

	
	cin >> A;
	cin >> B;

	int array_a = 0;
	int array_b = 0;
	int array_c = 0;

	for (int i = 0; A[i] != '\0'; i++)
	{
		array_a++;
	}


	int count = 0;
	for (int i = array_a -1 ; i >= 0; i--)
	{
		a_alpha[count] = A[i];
		count++;
	}

	for (int i = 0; B[i] != '\0'; i++)
	{
		array_b++;
	}

	int count2 = 0;
	for (int i = array_b - 1; i >= 0; i--)
	{
		b_alpha[count2] = B[i];
		count2++;
	}
	

	//연산하는 부분
	if (array_a >= array_b) {
		int upCount = 0;
		for (int i = 0; i < array_a; i++)
		{
			int num = a_alpha[i] - '0';
			int num2 = 0;
			if (b_alpha[i] == '\0')
			{
				num2 = b_alpha[i];
			}
			else
			{
				num2 = b_alpha[i] - '0';
			}

			C[i] = ((num + num2 + upCount) % 10) + '0';
			upCount = (num + num2 + upCount) / 10;

			//array_a이 끝이고 올림이 발생했다면 하나 더 넣어주기
			if (array_a - 1 == i && upCount == 1)
			{
				C[array_a] = upCount + '0';
			}

		}
	}
	else {
		int upCount = 0;
		for (int i = 0; i < array_b; i++)
		{
			int num = b_alpha[i] - '0';
			int num2 = 0;
			if (a_alpha[i] == '\0')
			{
				num2 = a_alpha[i];
			}
			else
			{
				num2 = a_alpha[i] - '0';
			}

			C[i] = ((num + num2 + upCount) % 10) + '0';
			upCount = (num + num2 + upCount) / 10;

			//array_a이 끝이고 올림이 발생했다면 하나 더 넣어주기
			if (array_b - 1 == i && upCount == 1)
			{
				C[array_b] = upCount + '0';
			}

		}
	}


	for (int i = 0; C[i] != '\0'; i++)
	{
		array_c++;
	}
	

	for (int i = array_c - 1; i >= 0; i--)
	{
		cout << C[i];
	}


	return 0;
}

문제점 : 소스의 간략화를 못했다.

#include <iostream>
#include <vector>
#include <string>

using namespace std;


//cin 는 char 배열, double 형, int형을 담을수 있다.
string s1, s2, temp; //배열의 용량을 입력하지 않아도됨 => 동적 메모리
int num1[10001];
int num2[10001];


int main()
{
	
	/*
		두 정수 A와 B를 입력받은 다음 A+B를 출력하는 프로그램을 작성하시오.
	*/
	
	cin >> s1 >> s2;
	int sum;
	vector <int> vec;

	//더 긴수를 s1으로 받기
	if (s1.size() < s2.size()) 
	{
		temp = s1;
		s1 = s2;
		s2 = temp;
	}

	//num1, num2 배열 만드는 과정
	//배열의 맨 앞자리는 올림으로 인한 1이 발생할수 있기 때문에 비워준다.
	for (int i = 0; i < s1.size(); i++)
	{
		num1[i + 1] = s1[i] - '0'; 
	}

	for (int i = 0; i < s2.size(); i++)
	{
		num2[i + 1 + (s1.size() - s2.size())] = s2[i] - '0'; 
		//두 배열의 길이의 차를 더해준이유는 맨 끝자리 부터 반복문으로 돌려 배열에 저장해주기 위해
		//수의 자리를 맞춰 준다.
	}
	
	for (int i = s1.size(); i > 0; i--)
	{
		sum = num1[i] + num2[i];
		if (sum > 10)
		{
			num1[i - 1]++;//윗자리에 +1 해준다.
			sum -= 10;// 10이상이면 10을 빼줌으로써 나머지값을 구할수 있다.
		}
		vec.push_back(sum);
	}

	//윗자리 + 1로 맨 윗자리 수가 1로 올라갔으면 1출력되게 한다.
	if (num1[0] != 0)
	{
		cout << 1;
	}
	
	//벡터값을 거꾸로 출력해준다.
	for (int i = vec.size() - 1; i >= 0; i--)
	{
		cout << vec[i];
	}

	return 0;
}
반응형