프로그래머스 두 수의 합 문제 바로가기

Python이나 Java의 경우 이 문제는 매우 쉽다. 숫자의 크기가 매우 커도 처리할 수 있기 때문에…

def solution(a, b):
    return str(int(a) + int(b))

하지만 C++의 경우 long long 8byte가 최대다. 더 확장하고 싶으면 BigInteger을 직접 구현해야하는데, 문제 푸는데 언제 다 구현하고 앉아있어…!! 이 문제의 경우 숫자의 길이가 최대 100,000자리이기 때문에 일반적인 연산으로는 계산이 불가하다. 그래서 마치 우리가 세로셈으로 손계산하듯이 (초등학교 세자리수 덧셈마냥) 올림을 고려하면서 한 자리씩 계산하도록 구현했다.

내 풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string a, string b) {
    string ans = "";
    
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    
    if (a.size() < b.size()){
        a.resize(b.size(), '0');
    } else {
        b.resize(a.size(), '0');
    }    
    
    // a[i] + b[i] = 10*p + q
    int p = 0;
    for (int i=0; i<a.size(); i++){
        int cur = (a[i] - '0') + (b[i] - '0') + p;
        ans += to_string(cur%10);
        p = cur/10;
    }
    if (p != 0){
        ans += to_string(p);
    }
    
    reverse (ans.begin(), ans.end());
    return ans;    
}

일의 자리에서부터 계산하기 위해서 reverse() 함수를 사용해서 뒤집어주고 차례대로 연산해 나간다. 이때 올림이 있는 경우를 대비해서 p(10으로 나눈 몫)에 저장해두고 다음 연산 때 꺼내서 사용한다.