[문제 출처]https://www.acmicpc.net/problem/10757
10757번: 큰 수 A+B
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
두 정수를 입력 받아 덧셈을 하는 간단한 사칙연산 프로그램 문제였다.
그러나 입력의 조건이 10의 1만 제곱 미만까지 가능하므로 unsigned int(0 ~ 2의 32제곱)도 소용이 없다.
단순히 더 큰 자료형을 찾으라는 문제는 아닌 것 같아서 결국 입력을 받는 자료형은 문자열밖에 없다는 생각을 했다.
일단 입력을 문자열로 받은 후 덧셈을 하는 과정을 똑같이 따라하면 되겠다고 생각했다. 노가다인 것 같았지만 다른 해결방법이 생각나지 않았다. 먼저 입력받은 두 문자열에서 뒤에서 부터(1의 자리) 숫자를 하나씩 꺼내 더한 후 벡터에 삽입한다.
삽입하기 전에 벡터의 가장 최근 숫자를 꺼내 본다. 만약 이 최근 숫자가 10이상이라면 현재 덧셈 결과에 1을 더해주어야 한다.
더해준 후에는 최근 숫자에서 10을 뺀 다음 삽입하고 이후에 현재 계산한 결과를 삽입한다. 만약 최근 숫자가 10미만이라면 현재 계산 결과를 바로 삽입한다. 이런 방식을 계속 반복하면서 덧셈을 진행한다.
반복문은 양쪽이 모든 숫자를 삽입하도록 조건을 나누었다. 1. 두 입력 모두 숫자가 남았을 때 2. 한 쪽만 남았을 때 3. 더 이상 꺼낼 숫자가 없을 때
결과를 출력할 때는 현재 벡터에 1의 자리의 결과부터 들어가 있으므로 거꾸로 출력했다.
아쉬운 점은 반복되는 if - else가 너무 많고 반복문이 할 일이 많아 보였다. 문제를 해결하기만 하려는 방식인 것 같다.
[전체 소스 코드]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cin.tie(NULL);
cin.sync_with_stdio(false);
string A, B;
int indexA, indexB;
vector<int> C;
cin >> A >> B;
indexA = A.length() - 1;
indexB = B.length() - 1;
C.push_back(0);
while (indexA >= 0 || indexB >= 0)
{
if(indexA >= 0 && indexB >= 0){
if(C.back() >= 10){
int temp = C.back();
C.pop_back();
C.push_back(temp - 10);
C.push_back((A[indexA] - '0') + (B[indexB] - '0') + 1);
} else {
C.push_back((A[indexA] - '0') + (B[indexB] - '0'));
}
} else if(indexA >= 0){
if(C.back() >= 10){
int temp = C.back();
C.pop_back();
C.push_back(temp - 10);
C.push_back((A[indexA] - '0') + 1);
} else {
C.push_back((A[indexA] - '0'));
}
} else {
if(C.back() >= 10){
int temp = C.back();
C.pop_back();
C.push_back(temp - 10);
C.push_back((B[indexB] - '0') + 1);
} else {
C.push_back((B[indexB] - '0'));
}
}
indexA--;
indexB--;
}
for (int i = C.size() - 1; i > 0; i--)
{
cout << C[i];
}
cout << '\n';
}
[백준] 1931번 회의실 배정 - 결과 포함 (0) | 2021.01.20 |
---|---|
[백준] 11047번 동전 0 - 결과 포함 (0) | 2021.01.20 |
[백준] 1436번 영화감독 숌 - 결과 포함 (0) | 2021.01.18 |
[백준] 1018번 체스판 그리기 - 결과 포함 (0) | 2021.01.18 |
[백준] 11653번 소인수분해 - 결과 포함 (0) | 2021.01.14 |