본문 바로가기
Practice & Study/백준 문제풀이

boj 10757 큰 수 A + B (c++)

 

 

파이썬 같은 언어는 10,000자리 정도의 자연수도 자유롭게 다룰 수 있습니다.

하지만 C/C++이라면 이 문제를 어떻게 풀까요? C/C++ 사용자가 아니더라도 고민해 보면 좋을 것입니다.

 

-> 문제의 부연설명으로 C++의 자연수 자릿수에 대한 이야기가 있었다.

 

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char * argv[]) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int A[100001], B[100001], rslt[100001];
    int carry = 0;
    
    string s1, s2;
    
    cin >> s1 >> s2;
    
    for(int i = 0; i < s1.length(); i++) {
        char tmp = s1.at(i);
        A[s1.length() - i - 1] = atoi(&tmp);
    }
    
    for(int i = 0; i < s2.length(); i++) {
        char tmp = s2.at(i);
        B[s2.length() - i - 1] = atoi(&tmp);
    }
    
    for(int i = 0; i < max(s1.length(), s2.length()); i++) {
        rslt[i] = A[i] + B[i] + carry;
        if (rslt[i] >= 10) {
            rslt[i] -= 10;
            carry = 1;
        }
        else
            carry = 0;
    }
    
    if(carry == 1)
        cout << 1;
    
    for(int i = 0; i < max(s1.length(), s2.length()); i++) {
        cout << rslt[max(s1.length(), s2.length()) - i - 1];
    }
    cout<< '\n';
    
    return 0;
}

 

정수 자료형으로는 데이터를 받기 어려우니 string 클래스를 이용하도록 한다.

string을 이용하여 큰 수를 받고 배열을 이용하여 수를 하나씩 떼서 배열에 넣는 것이다.

 

이 때 오프라인에서 더하기 하는 것 처럼 같은 자리 수의 숫자들을 더했을 때 10을 넘으면

그 윗자리로 수를 올려줘야하므로 carry 변수를 사용한다.

 

배열 크기는 문제에서 A, B 의 범위를 10의 10000제곱이라고 해서 저렇게 해놨다.

 

rslt 배열의 크기를 두 문자열 중 큰 녀석으로 하면 숫자가 그 이상으로 커지면 어쩌려고 걱정했는데

그것은 carry가 해결할 것이라 안-심.

 

 

 

사담_

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    unsigned long long A, B;
    cin>> A >> B;
    
    unsigned long long rslt;
    rslt = A + B;
    
    cout<< rslt <<'\n';
    return 0;
}

테스트 케이스에 맞춰서 코드를 짰을 때에는

범위가 0~18,446,744,073,709,551,615 인 unsinged long long 자료형을 사용하였다.

너무 간단한 거 아냐?라고 생각하는 순간 '틀렸습니다'가 떴고,

질문 게시판에 들어가서 다른 사람들의 코드를 대충 훑어보니

다들 전혀 다른 방법으로 풀고있다는 걸 알았다. 

 

그리고 위에 부연설명을 다시 읽어보니 10,000인 수가 아니라 만자릿수를 다룰 수 있어야 한다고 덜덜..

그러니까 long long을 넘어가는 문제였던 것이다.