상세 컨텐츠

본문 제목

[백준] 10757번 큰 수 A + B - 결과 포함

개발 공부 (알고리즘)

by letprogramming 2021. 1. 14. 02:48

본문

반응형

[문제 출처]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';
    
}

 

반응형

관련글 더보기