6. 자료구조 & 알고리즘/6-2. 백준

백준 - [10757번: 큰 수 A+B]

yunyj99 2022. 6. 17. 23:20

큰 수 A+B

문제

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

 

입력

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

 

출력

 

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

 

예제 입력 1 

9223372036854775807 9223372036854775808

예제 출력 1 

18446744073709551615

 

 


먼저 BigInteger를 이용해 푼 방식

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(br.readLine());

		BigInteger A = new BigInteger(st.nextToken());
		BigInteger B = new BigInteger(st.nextToken());
		
		bw.write(A.add(B)+"");
		bw.flush();
		bw.close();
		br.close();
	}
}

 

그리고 charAt을 이용해 숫자를 하나하나씩 비교해서 계산한 방식

시간은 좀 줄었는데 메모리를 엄청 차지한다...

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(br.readLine());
		String A = st.nextToken();
		String B = st.nextToken();

		String small = "", big = "";

		if (A.length() > B.length()) {
			big = A;
			small = B;
		} else {
			big = B;
			small = A;
		}

		int sum = 0; // charAt으로 숫자 하나씩 가져와 더한 값 담을 변수
		int over = 0; // sum의 합이 10 넘었는지 비교하기 위한 변수
		String result = "";
		for (int i = 1; i <= small.length(); i++) { // 더 작은 수 길이만큼 비교
			sum = big.charAt(big.length() - i) + small.charAt(small.length() - i) - '0' * 2;
			if (over == 1) {
				sum++;
				over = 0;
			}
			if (sum >= 10) {
				over = 1;
			}
			result = sum % 10 + result;

		}

		if (A.length() != B.length()) { // 길이 다를 경우
			for (int i = 0; i < big.length() - small.length(); i++) {
				sum = big.charAt(big.length() - small.length() - 1 - i) - '0';
				if (over == 1) {
					sum++;
					over = 0;
				}
				if (sum >= 10) {
					over = 1;
				}
				result = sum % 10 + result;
			}
			if (over == 1) {
				result = 1 + result;
			}
		} else { // 길이 같을 경우
			if (over == 1) {
				result = 1 + result;
			}
		}

		bw.write(result);
		bw.flush();
		bw.close();
		br.close();
	}
}

 

마지막으로 다른 분들 코드를 참조해 수정한 방식

숫자를 배열에 넣어서 계산했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		StringBuilder sb = new StringBuilder();

		String A = st.nextToken();
		String B = st.nextToken();

		int max = (A.length() > B.length()) ? A.length() : B.length();

		int[] aArr = new int[max];
		int[] bArr = new int[max];
		int[] sumArr = new int[max + 1];

		for (int i = 0; i < A.length(); i++) { // 뒤에 숫자부터 담음
			aArr[i] = A.charAt(A.length() - i - 1) - '0';
		}

		for (int i = 0; i < B.length(); i++) {
			bArr[i] = B.charAt(B.length() - i - 1) - '0';
		}

		for (int i = 0; i < max; i++) {
			int sum = aArr[i] + bArr[i] + sumArr[i];
			sumArr[i] = sum % 10;
			sumArr[i + 1] = sum / 10;
		}

		if (sumArr[max] == 1) {
			sb.append(sumArr[max]);
		}
		for (int i = max - 1; i >= 0; i--) {
			sb.append(sumArr[i]);
		}

		System.out.println(sb);
		br.close();
	}
}