큰 수 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();
}
}
'6. 자료구조 & 알고리즘 > 6-2. 백준' 카테고리의 다른 글
백준 - [11653번: 소인수분해] (0) | 2022.06.19 |
---|---|
백준 - [1978번: 소수 찾기] (0) | 2022.06.19 |
백준 - [1316번 : 그룹 단어 체커] (0) | 2022.06.15 |
백준 - [11654번: 아스키 코드] (0) | 2022.06.15 |
백준 - [4673번: 셀프 넘버] (0) | 2022.06.15 |