출처 : 백준 #10757
시간 제한 | 메모리 제한 |
---|---|
1초 | 256MB |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)
첫째 줄에 A+B를 출력한다.
9223372036854775807 9223372036854775808
18446744073709551615
String
으로 접근하고자 하였다.String
배열로 해당 십진수의 각 자리수들을 저장한 후 2개의 String
배열을 더하여 각 자리수마다 더하여 (저번에 학습한)2진수 변환기 메서드를 이용해보려고 하였으나, 10진수 자리수가 증가함에 따라 2진수가 같은 자리수만큼 증가하지 않기에,,(규칙성도 딱히 보이지 않음) 이 방법은 결국 구현을 못했다 ㅠㅠString
배열 두개를 각각 byteadder 메서드에서 구현한것과 같이 각 자리수마다 돌면서, 더하고 carry 값을 넘겨주는 방식으로 구현해보았다.// 백준 10757번 큰 수 A+B
package algorithm;
import java.util.*;
public class Baekjoon10757 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
String minString = min(str1, str2);
String maxString = max(str1, str2);
int[] number1 = str2int(minString);
int[] number2 = str2int(maxString);
int[] tempNumber = new int[maxString.length()];
// 0으로 자릿수 채우기
for(int i = 0; i < maxString.length(); i++){
if (i < minString.length()){
tempNumber[i] = number1[i];
} else {
tempNumber[i] = 0;
}
}
number1 = tempNumber; // 부족한 자리수를 0으로 채운 배열로 바꾸기
int carry = 0;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < maxString.length(); i++){
int[] adderResult = fulladder(number1[i], number2[i], carry);
carry = adderResult[0];
list.add(adderResult[1]);
}
if (carry == 1){
list.add(1);
}
String answer = "";
for(int i = list.size()-1; i > -1; i--){
answer += list.get(i);
}
System.out.println(answer);
}
private static int[] str2int(String str){
int[] intArray = new int[str.length()];
int length = str.length();
for(int i=0; i<length;i++){ // 리틀 엔디안 방식으로 적
intArray[length-1-i] = str.charAt(i) - '0';
}
return intArray;
}
private static String min(String str1, String str2) {
int tmpLength1 = str1.length();
int tmpLength2 = str2.length();
if(tmpLength1 > tmpLength2){
return str2;
}
return str1;
}
private static String max(String str1, String str2){
int tmpLength1 = str1.length();
int tmpLength2 = str2.length();
if(tmpLength1 > tmpLength2){
return str1;
}
return str2;
}
private static int[] halfadder(int a, int b){
int carryResult = carry(a, b);
int sumResult = sum(a, b);
int[] answer = {carryResult, sumResult};
return answer;
}
private static int carry(int a, int b){
return (a+b)/10;
}
private static int sum(int a, int b){
return (a+b)%10;
}
private static int[] fulladder(int a, int b, int carry){
int[] tempArr = halfadder(a, b);
int[] carryArr = halfadder(tempArr[1], carry);
int finalCarry = sum(tempArr[0], carryArr[0]);
int[] answer = {finalCarry, carryArr[1]};
return answer;
}
}
---