백준/단계별

[Python / C++] 백준 10757

loasd 2022. 12. 23. 01:08
반응형

백준의 10757번 문제 큰수 A+B이다.

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

 

10757번: 큰 수 A+B

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

www.acmicpc.net


 < 문제 > 

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

 

 < 예제 >

 

 

매우 큰 수를 더하는 문제이다.

원래 C++를 사용해서 풀려고 했는데 파이썬이 매우 간단하여 파이썬으로 작성하였다.

아래에 C++로 실패한 코드를 소개하도록 하고 우선 문제는 파이썬으로 풀었기 때문에 파이썬에서의 정답을 보자면

A, B = map(int, input().split())
print(A+B)

파이썬을 사용하면 2줄로 간단히 사용되는 것을 알 수 있다.

 

이 문제의 경우 파이썬은 오버플로우가 없어 매우 큰 수여도 그냥 더할 수 있다.

반면에 C++는 매우 큰 수를 계산할 수 없기 때문에 int형을 사용하지 않고 String을 사용해야 한다.

 

문제만 보고 5분안에 풀고 쉬어야지 했다가 점점 복잡해져서 결국 간단한 파이썬으로 하기로 했다.

 

 

아래에서는 C++로 어떻게 풀지 생각한게 있는데 이를 작성해보려 한다.

다른 사람들도 정답은 아니어도 이 코드에서 아이디어를 얻을 수 있다면 좋을 것 같아 작성한다.


정답코드 아님 

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

int main() {

	string a, b;
	cin >> a >> b;

	string c;
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	
	int length = 0;
	int length2 = 0;
	if (a.length() > b.length()) {
		length = a.length();
		length2 = b.length();
		for (int i = 1; i <= length - length2; i++) {
			b += "0";
		}
	}
	else if(a.length() == b.length()) {
		length = a.length();
	}
	else {
		length = b.length();
		length2 = a.length();
		for (int i = 1; i <= length - length2; i++) {
			a += "0";
		}
	}

	for (int i = 0; i <= length; i++) {
		if ((a[i] - '0') + (b[i] - '0') > 9) {
			a[i] = (a[i] - '0') + (b[i] - '0') - 10 + '0';
			a[i + 1]++;
		}
		else {
			a[i] = (a[i] - '0') + (b[i] - '0') + '0';
		}
	}
	if ((a[length - 1] - '0') + (b[length - 1] - '0') > 9) {
		a += '1';
		reverse(a.begin(), a.end());
	}
	else
		reverse(a.begin(), a.end());

	cout << a << endl;

}

원래는 이렇게 해서 문제를 풀려고 했다.

 

	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	
	int length = 0;
	int length2 = 0;
	if (a.length() > b.length()) {
		length = a.length();
		length2 = b.length();
		for (int i = 1; i <= length - length2; i++) {
			b += "0";
		}
	}
	else if(a.length() == b.length()) {
		length = a.length();
	}
	else {
		length = b.length();
		length2 = a.length();
		for (int i = 1; i <= length - length2; i++) {
			a += "0";
		}
	}

먼저 2개의 문자열을 받아오고 문자열의 순서를 반대로 하였다.

예를들어 111222333을 받아왔다면 333222111이 되도록 하였다.

그리고 입력받은 두 문자열의 길이를 맞춰줬다.

예를들어 1111 111122가 입력되었다면 001111 111122 이렇게 되게 하였다.

 

	for (int i = 0; i <= length; i++) {
		if ((a[i] - '0') + (b[i] - '0') > 9) {
			a[i] = (a[i] - '0') + (b[i] - '0') - 10 + '0';
			a[i + 1]++;
		}
		else {
			a[i] = (a[i] - '0') + (b[i] - '0') + '0';
		}
	}
	if ((a[length - 1] - '0') + (b[length - 1] - '0') > 9) {
		a += '1';
		reverse(a.begin(), a.end());
	}
	else
		reverse(a.begin(), a.end());

	cout << a << endl;

그리고 여기서 문자열의 배열의 값을 각각 더했을때 10이 넘어가면 다음 문자열이 1 증가하게 하였다.

 

그런데 마지막 배열이 올림되었을 때 숫자가 나오지 않았다.

예제를 예로 들자면

9223372036854775807 + 9223372036854775808 = 18446744073709551615

이렇게 나와야되는데 결과값이 8446744073709551615 이렇게 나오는 것이다.

 

그래서 마지막에 가장 최근의 숫자끼리 더했을 때 올림이 생기면 String a에 1을 추가하게 하였다.

 

그런데 이렇게 하다보니 999 + 9999999 를 했을 때는 a와 b가 0000999 + 9999999이 되어서

(a[length - 1] - '0') + (b[length - 1] - '0')가 9가 나오는바람에 결과값이 제대로 나오지 않았다.

 

이부분만 어떻게 고치거나 위에 계산식에서 처리하면 될 것 같다.

 

난이도가 생각보다 높아서 봤는데 파이썬기준으로 정해져서 낮은거였다.

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

C를 사용한 문제는 위의 링크를 통해 확인할 수 있다.

 

 

 

혹시 이렇게 하면 될것 같거나 문제 해결 방법을 아시는 분이 계시다면 댓글로 남겨주시면 감사하겠습니다.

 

반응형

'백준 > 단계별' 카테고리의 다른 글

[C++] 백준 2581  (0) 2022.12.27
[C++] 백준 1978  (1) 2022.12.26
[C++] 백준 2839  (0) 2022.12.22
[C++] 백준 2775  (0) 2022.12.22
[C++] 백준 10250  (0) 2022.12.22