BAEKJOON #10757 큰 수 A+B - Java

nathan·2022년 1월 5일
0

알고리즘문제

목록 보기
96/102

큰 수 A+B

출처 : 백준 #10757

시간 제한메모리 제한
1초256MB

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)


출력

첫째 줄에 A+B를 출력한다.


입출력 예시

예제 입력 1

9223372036854775807 9223372036854775808

예제 출력 1

18446744073709551615


풀이

설명

  • 우선 예제로 알 수 있듯이, Long이 가질 수 있는 크기를 넘는 수를 더하므로 String으로 접근하고자 하였다.
  • String 배열로 해당 십진수의 각 자리수들을 저장한 후 2개의 String 배열을 더하여 각 자리수마다 더하여 (저번에 학습한)2진수 변환기 메서드를 이용해보려고 하였으나, 10진수 자리수가 증가함에 따라 2진수가 같은 자리수만큼 증가하지 않기에,,(규칙성도 딱히 보이지 않음) 이 방법은 결국 구현을 못했다 ㅠㅠ
  • 따라서 그냥 String 배열 두개를 각각 byteadder 메서드에서 구현한것과 같이 각 자리수마다 돌면서, 더하고 carry 값을 넘겨주는 방식으로 구현해보았다.

java code

// 백준 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;
    }

}

--- 
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글