문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10^10000)
출력
첫째 줄에 A+B를 출력한다.
문제 접근 방법
이번 문제는 숫자를 입력받는 변수형에 저장이 안 될 만큼 큰 수를 더하는 문제이다. 따라서 기존처럼 변수에 저장해서 더하는 단순한 문제가 아니다. 물론 JAVA로 문제를 MATH패키지에서 제공하는 BigInteger클래스를 선언하여 쉽게 풀 수 있는 방법도 있으나, c/c++ 같은 경우는 큰 수의 연산이나 저장을 지원하는 패키지가 없다. 따라서 1차원 배열을 만들어 자릿수 별로 각각 다른 인덱스에 저장하여 한 자리씩 덧셈을 해준다. 이때, 두 수의 자릿수가 항상 같으리라는 보장이 없으므로 두 배열을 만들 때 두 수를 일단 문자열로 입력받아 길이를 측정한 후 더 긴 자릿수를 따라 두 수를 저장하는 int배열의 길이를 지정해준다. 이때, 덧셈은 일의 자리서부터 시작하므로 숫자를 배열에 저장할 때는 일의 자리부터 index 0에서부터 역으로 저장해서 더해주고, 10이 넘어가면 십의 자리는 다음 인덱스에 더해서 다음 계산 때 반영해준다.
JAVA 코드 풀이
- 배열 사용 코드
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String a = input.next();
String b = input.next();
int maxLen = Math.max(a.length(), b.length());
int aL[] = new int[maxLen+1];
int bL[] = new int[maxLen+1];
for(int i=a.length()-1, idx=0; i>=0; i--, idx++){
aL[idx] = a.charAt(i) - '0';
}
for(int i=b.length()-1, idx=0; i>=0; i--, idx++){
bL[idx] = b.charAt(i) - '0';
}
for(int i=0; i<maxLen; i++){
aL[i+1] += (aL[i]+bL[i])/10; // 각 자릿수 덧셈 중 10을 넘으면 십의자리는 다음 덧셈할 때 더해서 같이 계산
aL[i] = (aL[i]+bL[i])%10; // 일의자리만 해당 자릿수의 결과값으로 남긴다
}
if(aL[maxLen] != 0) // 마지막 자릿수 덧셈에서 10이 넘지 않아 마지막 배열에 0이 저장된경우 출력하지 않는다.
System.out.print(aL[maxLen]);
for(int i=maxLen-1; i>=0; i--)
System.out.print(aL[i]);
}
}
- BigInteger클래스 사용
import java.util.*;
import java.math.*;
public class Main{
public static void main(String args[]){
Scanner input = new Scanner(System.in);
BigInteger n1 = new BigInteger(input.next());
BigInteger n2 = new BigInteger(input.next());
System.out.println(n1.add(n2));
}
}
후기
Python에서는 그냥 더해줘도 계산이 되고, JAVA에서는 Math패키지의 BigInteger을 이용해줘도 되지만, C/C++에서는 계산할 수 있는 방법이 배열에 저장해서 하는 방법뿐이다. 따라서 JAVA에서도 두 버전 모두 구현해보았고, 나중에 너무 숫자가 크거나 크기 때문에 연산이나 저장이 되지 않는 경우 다른 방법으로도 할 수 있는 방법을 배워두면 좋을 것 같다는 생각이 든다. 해당 언어에서 사용 가능한 방법도 알아둬야겠지만 말이다.