#63. 백준 10757번 문제 풀이: 큰 수 A+B | 문제 원본 보기 |
--입력-- 9223372036854775807 9223372036854775808 --출력-- 18446744073709551615
변수가 담을 수 있는 범위보다 큰 수가 들어왔을 경우 일반 연산이 불가능하다. C나 C++의 경우 최대 정수범위가 8바이트 정도이다. 문제에서 입력으로 주는 수를 담기에는 턱없이 부족하다. 실제로 long long int 로 변수로 받으면, 범위를 넘어서서 -1 이 된다. 그래서 a + b 결과는 -2 가 된다. 이번 경우는 문자열로 받아서 계산 연산을 구현해서 문자열로 출력해야 한다. 단, 파이썬의 경우는 그대로 더하기 해도 정상적으로 출력된다. 하지만 문제의도에 따라 파이썬도 문자열로 더하기 연산을 하는 것을 구현하도록 하겠다. 루틴은 실제 사람이 계산하는 방법과 같다. 다음과 같이 구현하면 된다. 1. A 문자열과 B 문자열에 숫자를 저장한다. 2. 계산을 쉽게하기 배열 인덱스를 0부터 진행하기 위해, A, B 문자열을 순서를 리버스시킨다. 3. A 와 B의 앞에서 부터 한자리씩, 문자를 하나씩 꺼내서 -'0' 아스키코드 값을 빼주면 십진수가 된다. 더하기를 해준다. 더하기 해서 10 이상이면 올림수를 체크해 둔다. 4. 결과값을 C 배열 같은 자리에 넣는다. 5. 3번을 반복한다. 단 올림수가 있으면 +1을 해준다. 6. 루프가 끝나면 C 문자열을 리버스해서 정상숫자로 만들어 준다. 7. 출력하면 끝.
파이썬에서는 매우 길다란 숫자도 연산할 수 있도록 만들어져 있다. 그래서 그냥 A, B를 int 로 입력받아 A + B 연산을 해서 출력하면 정상 작동한다. 하지만, 문제의 의도대로 파이썬으로도 문자열을 상태에서 더하기 연산을 구현해 보겠다.
# 파이썬에서는 긴정수도 문제없이 연산가능하다.
# print(A + B) 처럼 그냥 쓰면 된다.
# 하지만 문제의도에 따라 문자열로 더하기 연산하는 알고리즘을 사용해 구현해 보았다.
A, B = input().split() # 두 숫자 문자열을 문자열로 입력 받음.
C = ""; # 결과를 담을 문자열 변수
# 문자열 인덱스를 0부터 사용하기 위해 문자열들을 리버스 시킨다.
A = "".join(reversed(A)) # 뒤집기. 문자열을 리스트로 뒤집어 다시 문자열로 합침
B = "".join(reversed(B)) # 문자열 뒤집기
l_A = len(A)
l_B = len(B) # 문자열 길이만큼 연산을 하기 위해.
c0 = ord('0') # 숫자문자에서 '0'을 빼주면 숫자값이 된다. ord('0') 대신 사용.
i = 0 # 문자열 연산을 위한 위치 인덱스
carry = 0 # 연산시 자리올림수가 있을 경우 1
while i < l_A or i < l_B: # 제일 긴 문자열까지 루프
if i < l_A and i < l_B: # A + B 덧셈
sum = (ord(A[i]) - c0) + (ord(B[i]) - c0)
elif i < l_A: # A 만 더함
sum = ord(A[i]) - c0
elif i < l_B: # B 만 더함
sum = ord(B[i]) - c0
sum += carry
carry = 0 # 올림수 초기화
if sum > 9: # 10 이상이면 올림수 발생
carry = 1;
sum -= 10;
C += chr(sum + c0) # 더한 값을 문자로 만들어 넣어줌.
i += 1;
if carry > 0: C += '1' # 마지막 올림수 있으면 처리
C = "".join(reversed(C)) # 문자열을 원래대로 리버스
print(C) # 결과값 문자열로 출력