백준/C++

[백준] 10757번: 큰 수 A+B | C++ 풀이

성실한 당근농부 2023. 6. 5. 09:55

# 문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

 


# 풀이

C++에서 큰 수의 연산은 string으로 받으면 될 것 같은데 딱 여기까지만 떠오르고 그 이후의 방법이 생각이 안 났다.

특히 올림을 어떻게 처리할지가 막막했는데 공부한다 생각하고 우선 다른 분들의 코드를 많이 보러 다녔다.

그렇게 해서 얻어낸 나의 정답 소스 코드, 바로 확인해보자.

 

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string addNum(string a, string b);

int main() {
    string a, b;
    cin >> a >> b;
    
    string sum = addNum(a, b);
    cout << sum;
    return 0;
}

string addNum(string a, string b) {
    string res;

    // 큰 수로 자릿수 맞추기
    int maxLen = max(a.length(), b.length());
    a = string(maxLen - a.length(), '0') + a;
    b = string(maxLen - b.length(), '0') + b;

    int carry = 0; // 올림
    for (int i = maxLen - 1; i >= 0; i--) {
        int digitSum = (a[i] - '0') + (b[i] - '0') + carry; // 각 자릿수 계산
        carry = digitSum / 10; // 올림 계산
        res += (digitSum % 10) + '0'; // 자리수를 결과에 더함
    }

    // 연산을 모두 마친 후에 올림 값이 남아있다면 올림 값을 결과에 더해줌
    if (carry > 0) res += carry + '0';

    // 결과를 뒤집어 출력하면 원하는 연산 결과를 얻을 수 있음
    reverse(res.begin(), res.end());

    return res;
}

이번 코드에서는 큰 수 A, B를 더하는 과정을 addSum 함수로 따로 구현해주었다.

 

 

 

// 큰 수로 자릿수 맞추기
int maxLen = max(a.length(), b.length());
a = string(maxLen - a.length(), '0') + a;
b = string(maxLen - b.length(), '0') + b;

우선 입력된 두 수의 자릿수가 다를 경우를 생각해 0으로 자릿수를 맞춰주었다.

string으로 계산하기 때문에 꼭 필요한 절차다.

 

 

 

int carry = 0; // 올림
for (int i = maxLen - 1; i >= 0; i--) {
    int digitSum = (a[i] - '0') + (b[i] - '0') + carry; // 각 자릿수 계산
    carry = digitSum / 10; // 올림 계산
    res += (digitSum % 10) + '0'; // 자리수를 결과에 더함
}

자릿수를 맞춘 후에는 각각의 자리를 더해 결과에 넣어주면 되는데, 이때 우리는 올림 값을 고려해야한다.

1의 자릿수부터 계산해야 하기 때문에 for문을 위와 같이 구성해주었고,

string을 int로 변환해 계산하기 위해 아스키 코드 값을 활용해주었다.

그리고 자릿수의 합을 10으로 나눈 몫을 올림, 나머지를 해당 자릿수의 결과값 변수에 넣어주면 된다.

결과를 담는 res는 string이기 때문에 다시 아스키 코드 값을 활용해 변환해주는 것을 잊지 말자.

 

 

 

// 연산을 모두 마친 후에 올림 값이 남아있다면 올림 값을 결과에 더해줌
if (carry > 0) res += carry + '0';

 

for문을 돌며 계산을 끝낸 후에 만약 올림 값이 남아있다면 잊지 말고 결과 값에 추가해주어야 한다.

 

 

 

// 결과를 뒤집어 출력하면 원하는 연산 결과를 얻을 수 있음
reverse(res.begin(), res.end());

그리고 우리는 만약 a+b가 15+23이라면 83과 같은 식으로 결과를 저장해두었기 때문에 이를 뒤집어서 출력해야 원하는 연산 결과를 얻을 수 있다. reverse 함수를 사용해 답을 구해줬는데 반복문을 사용해도 결과는 동일하게 얻을 수 있다.

이렇게 구현한 addNum함수를 통해 a와 b를 더해주고, 출력해주면 끝!

 

 

 

이번 코드에서는 입출력 동기화 해제 코드를 적지 않았는데 이유는 아래와 같다.

ios_base::sync_with_stdio(false) 코드를 적게 될 경우 입출력 동기화가 해제되므로 입출력 성능이 향상된다. 이는 대량의 입력 또는 출력 작업이 필요한 경우에 유용하지만, 사용하는 메모리 버퍼 크기가 증가해 메모리 사용량이 늘어날 수 있다. (특히 대량의 입력을 처리할 때 큰 영향을 끼침)

따라서 코드 사용 시 성능은 향상되지만 메모리 사용량이 늘어날 수 있으므로 상황에 맞게 사용해야 한다. 이번 코드에서는 입력이 많지 않기 때문에 굳이 입출력 동기화를 해제해줄 필요가 없었다.

실제로 입출력 동기화 코드를 넣어 실행해보면 2168KB의 메모리를 사용, 넣지 않으면 2024KB의 메모리를 사용하였다.

 

 

 

 

 


 

 

 

10757번: 큰 수 A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

728x90