본문 바로가기
코딩 테스트/Python_백준

[백준/Python] 10757번 큰 수 A+B 문제

by 모두의 케빈 2023. 4. 11.

■ 10757번 큰 수 A + B 문제

 

출처: 백준 10757번 큰 수 A+B 문제

 

 

■ 코드 풀이

 

이 문제를 봤을 때 '너무 쉬운데?'라는 생각을 했습니다. 알고 보니, 파이썬에서만 쉬운 거였습니다. 다른 언어에서는 큰 수 연산 과정에서 메모리 초과가 발생한다고 합니다. 처음 알았네요. 그래서 파이썬은 아래와 같은 코드면 쉽게 문제를 풀 수 있습니다.

A, B = map(int, input().split())

print(A+B)

 

하지만 이렇게 풀면 공부가 안 되겠죠? 제 나름대로 머리를 굴려서 아래와 같이 코드를 바꿔봤습니다. 어디서 들은 건(?) 있어서 두 개의 큰 수를 string으로 입력받고, 이를 거꾸로 뒤집어서 일의 자리부터 더하는 코드를 만들어봤습니다.

정답은 맞게 나오는데, 제출해 보니 시간 초과가 나오네요. 아마 정말 '엄청나게 큰 수'가 들어오면 for loop를 도는데 시간이 오래 소요돼서 그런 것 같습니다. 더 공부를 하고 싶으시다면, 간단한 방법 말고 저처럼 한 단계 더 코딩해 보시면 좋을 듯합니다.

A,B = input().split()

# 큰 수를 A로 설정
if len(A) <= len(B):
    A,B = B,A

# 1의 자리가 앞으로 오게 reverse
A = A[::-1]
B = B[::-1]

carry = 0  # 덧셈의 값이 10을 넘었을 경우 다음 자리로 전달해주는 변수
total = []   # 덧셈 결과를 담는 list

# 짧은 숫자 기준
for i in range(len(B)):
    num = int(A[i]) + int(B[i]) + carry
    carry = 0

    if num >= 10:
        carry = num // 10 # 10으로 나눈 몫을 다음 자리로 전달
        num =  num % 10   # 10으로 나눈 나머지를 num에 update
    total.append(num)

# 마지막 carry 값을 긴 자리 숫자에 반영
while carry >= 1:
    if len(B) == len(A):
        total.append(carry)
        break
    else:
        num = int(A[len(B)]) + carry
        if num >= 10:
            carry = num // 10
            num = 10 % num
        total.append(num)

# 큰 수 A의 남은 자리를 total에 입력
if len(A) > len(B):
    for i in A[len(total):len(A)+1]:
        total.append(i)

for i in total[::-1]:
    print(i, end ="")

 

댓글