본문 바로가기
Python/백준 문제 풀이

[BOJ] 10757번 큰 수 A+B

by 서원두 2022. 7. 28.

[BOJ] 10757번 큰 수 A+B 문제

두 개의 큰 수를 더하는 문제다. 하지만 이 문제는 파이썬에게 너무 쉬운 문제다.

그 이유인즉슨, 다른 언어에서는 long long을 이용해도 기껏해야 $ 2^{64} $까지만 나타낼 수 있는 반면 파이썬은 제한이 사실상 없기 때문이다! 물론 파이썬에서 sys 패키지를 import 한 후 sys.maxsize를 치면 최대 정수가 나오긴 하는데 (32비트 환경에서는 $ 2^{31}-1 $, 64비트 환경에서는 $ 2^{63}-1 $이 나온다) 이는 파이썬이 나타낼 수 있는 기본 최대 정수이며, 메모리가 버텨주는 한 이보다 더 큰 수를 써도 무방하다.

그렇기에 파이썬으로 이런 문제를 푸는 것은 너무나도 쉽다. 그냥 A와 B만 입력받아서 더하기만 하면 끝이다. 당장 파이썬으로 푼 1000번의 A+B 문제 정답을 그대로 긁어와도 맞는다.

진짜다

하지만 C / C++ / Java에서 이 문제는 심각한 골칫덩이다. 왜냐하면 이 언어들이 나타낼 수 있는 최대 수 표현을 넘어서는 수이기 때문이다. C / C++로 풀 수 있는 문제는 추가적으로 아래 링크에 남겨둔다. 참고로 문제 티어 색이 하나 다른 수준이다.

이 포스트를 올리는 이유는 매우 간단하다. 위의 언어들로 풀어야하는 법을 파이썬으로 써보기 위함이다.


이 문제를 푸는 방법은, 입력받는 모든 수를 문자열로 받아서 계산하는 것이다! 숫자로서 $ 10^{10000} $은 너무 크지만, 문자로서의 $ 10^{10000} $는 그저 최대 10001개의 문자일 뿐이다.

import sys

if __name__ == '__main__':
    A, B = sys.stdin.readline().rstrip().split()
    A, B = list(map(int, A)), list(map(int, B)) 
    A, B = list(reversed(A)), list(reversed(B))
    
    len_A, len_B = len(A), len(B)
    max_len = max(len_A, len_B)
    len_diff = abs(len_A - len_B)

    if len_A > len_B:
        for _ in range(len_diff):
            B.append(0)

    else:
        for _ in range(len_diff):
            A.append(0)

    is_round_up = False
    ans = list()
    for now_A, now_B in zip(A, B):
        now_add = now_A + now_B
        if is_round_up:
            now_add += 1

        is_round_up = True if now_add >= 10 else False
        ans.append(now_add%10)

    if is_round_up:
        ans.append(1)

    ans = list(reversed(ans))
    print(*ans, sep='')

 

이 문제의 핵심은 계산을 쉽게 하기 위해 입력받은 문자를 뒤집는 것, 길이 맞추기용 0을 붙이는 것, 올림(carry)을 신경 쓰는 것, 그리고 결과를 다시 뒤집는 것이다.

모든 덧셈이 끝난 이후에도 마지막 부분에서 올림이 남아 있다면 1을 꼭 붙여야한다. 이는 너무나도 당연하다.

728x90

댓글