문제 보기
https://www.acmicpc.net/problem/10757
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)
출력
첫째 줄에 A+B를 출력한다.
풀이방법
언리얼 공부를 하며 C++롤 문제를 풀어보기 시작했다.
C++은 나도 C#만큼 익숙하지 않았고, 이런저런 제약이나 신경 써야 할 부분도 많기 때문에 브론즈 5부터 문제를 훑으며 다시 올라와보기로 했다.
그렇게 찾은 브론즈 5 문제가 이 문제인데,
솔직히 브론즈 5 수준은 아니다.
정수형 변수의 자릿수를 신경 쓰지 않아도 되는 언어라든가 그런 기능을 하는 클래스를 사용한다면 아주 쉽게 풀겠지만
당연히 그 방법은 사용하지 않을 것이며
솔직히 C++에 그런 방법이 있는지도 모르겠다.
풀이 방법이 브론즈 5 수준은 아니다 뿐이지 딱히 어려운 건 아니다.
문자형 변수에 저장하고 자릿수별로 비교해서 더하면 된다.
string A;
string B;
string C;
cin >> A >> B;
숫자 A, B를 저장할 string A, B
결과 값을 저장할 string C를 준비했다.
string reverse(string str)
{
int length = str.length();
string output;
for (int i = 0; i < length; i++)
{
output += str[length - i - 1];
}
return output;
}
그리고 자릿수별로 더해주기에 앞서
맨 뒤의 자릿수부터 더하기 용이하도록 string을 뒤집어 줄 함수를 만들었다.
A = reverse(A);
B = reverse(B);
int plus = 0;
int length = A.length() < B.length() ? A.length() : B.length();
string big = A.length() > B.length() ? A : B;
A, B를 뒤집어줬다.
그리고 두 숫자의 길이를 비교하였다.
더 짧은 숫자의 길이 만큼만 더하기 작업을 진행할 것이다.
5 + 5 = 10의 십의 자릿수 처럼 다음 자릿수로 올라가는 수를 저장하기 위해 plus라는 변수도 선언하고 0으로 초기화해 주었다.
for (int i = 0; i < length; i++)
{
int sum = A[i] - '0' + B[i] - '0' + plus;
C += sum % 10 + '0';
plus = sum / 10;
}
for (int i = length; i < big.length(); i++)
{
int sum = big[i] - '0' + plus;
C += sum % 10 + '0';
plus = sum / 10;
}
if (plus != 0)
C += plus + '0';
이제 남은 건 더하기 작업이다.
1. 더 작은 수의 자릿수만큼 A +B + plus(올림수) 작업 진행
2. 해당 자릿수 다음부터 큰 수의 마지막 자릿수까지 big + plus(올림수) 작업 진행
3. 9999999999 + 1 같은 케이스도 있을 것이기 때문에 마지막에도 plus 값이 0이 아닌지 확인한 뒤 더해주었다.
C = reverse(C);
이제 마지막으로 결과값을 다시 뒤집어주자!
전체 코드
#include <iostream>
#include <string>
using namespace std;
string reverse(string str)
{
int length = str.length();
string output;
for (int i = 0; i < length; i++)
{
output += str[length - i - 1];
}
return output;
}
int main()
{
string A;
string B;
string C;
cin >> A >> B;
A = reverse(A);
B = reverse(B);
int plus = 0;
int length = A.length() < B.length() ? A.length() : B.length();
string big = A.length() > B.length() ? A : B;
for (int i = 0; i < length; i++)
{
int sum = A[i] - '0' + B[i] - '0' + plus;
C += sum % 10 + '0';
plus = sum / 10;
}
for (int i = length; i < big.length(); i++)
{
int sum = big[i] - '0' + plus;
C += sum % 10 + '0';
plus = sum / 10;
}
if (plus != 0)
C += plus + '0';
C = reverse(C);
cout << C;
return 0;
}
'ProblemSolve' 카테고리의 다른 글
[백준][C++] 1193 분수찾기 - 실버5 (0) | 2024.01.06 |
---|---|
[백준][C++] 2742 기찍 N - 브론즈4 (endl과 \n의 차이) (0) | 2024.01.02 |
[백준][C#] 1987 알파벳 - 골드4 (0) | 2023.07.14 |
[백준][C#] 1967 트리의 지름 - 골드4 (1) | 2023.07.13 |
[백준][C#] 1753 최단경로 - 골드4 (0) | 2023.07.12 |