🖥️ CS/Baekjoon Algorithms

백준 15353번 큰수 A+B (2) (C++)

한국의 메타몽 2021. 4. 1. 01:21

문제 링크 : www.acmicpc.net/problem/15353

 

15353번: 큰 수 A+B (2)

C++17, C11, C99, C++98, C++11, C++14, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

문제 풀이는 다음과 같다.

 1. 두 숫자 a와 b를 문자열로 입력받는다.

2. 둘 중 길이가 더 긴 값을 a로 저장하고 짧은 값을 b로 저장한다.

3. 문자열 a의 값 하나하나를 int형으로 num1 배열에 저장해준다. 이때 0부터 a의 size-1까지 순차적으로 받으며, 값은 int형으로 저장한다.

또한 편의상 num1[1]부터 값을 저장해준다.

4. 문자열 b도 마찬가지로 int형 배열에 저장해준다. 한가지 유의점은, 길이가 긴 문자열 a에 맞추기 위해 num2[1]이 아닌 아래와 같은 배열의 위치에 값을 저장해준다.

for(int i=0; i<b.size(); i++) num2[i+1+a.size()-b.size()] = b[i]-'0';

5. 위의 3~4번을 통해 두 문자열 a와 b의 값이 int형으로 저장되었다. 값을 더하기 위해 for문의 시작은 a.size()부터 시작한다.

-> 배열의 크기의 역순으로 덧셈을 하는 이유는, 3~4번을 통해 두 문자열의 값이 순차적으로 저장되었고, 결국 첫째 자리의 수는 배열의 맨 마지막에 저장되었기 때문이다.

-> 이때 a.size()-1이 아닌 이유는, 우리는 편의상 3~4번의 값 모두 배열의 첫 번째 부터 저장했기 때문이다.

6. a.size()에서 0까지 모두 계산을 끝낸뒤 for문을 빠져나온다. 이때 만약 num1[0]의 값이 0이 아닌 경우엔 마지막 덧셈의 값이 10을 초과했다는 의미이므로, 정답 배열의 끝자리에 1을 추가해준다.

7. 위의 5~6번을 통해 덧셈의 값이 배열의 0번째부터 마지막자리까지 저장되었다. 이때 정답은 역순으로 출력한다.

 

#include <iostream>
#include <vector>
using namespace std;

int num1[10001] = {0,}, num2[10001] = {0,};
vector<int> v;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    string a="", b="", temp = "";
    int c = 0;
    cin >> a >> b;
    if(a.size()<b.size()){ // 긴 문자열을 a에 저장
        temp = a;
        a = b;
        b = temp;
    }
    for(int i=0; i<a.size(); i++) num1[i+1] = a[i]-'0';
    for(int i=0; i<b.size(); i++) num2[i+1+a.size()-b.size()] = b[i]-'0';
    for(int i=a.size(); i>0; i--){
        c = num1[i]+num2[i];
        if(c>=10){
            num1[i-1]++;
            c-=10;
        }
        v.push_back(c);
    }
    if(num1[0]!=0) v.push_back(1);
    for(int i=v.size()-1; i>=0; i--) cout << v[i];
    return 0;
}

졸면서 풀다가 실수를 저질렀다. 자꾸 8%에서 틀리고 말았는데, a와 b중 큰 값을 저장하는 부분에서, if(a.size()<b.size())가 아닌 if(a<b)로 적었기 때문이었다.