▷ 문제 : https://www.acmicpc.net/problem/10757
Note
큰 수 문제는 입력되는 값이 정수형으로 처리할 수 있는 크기가 넘기 (0 < A,B < 1010000) 때문에 단순히 int sum = A + B 하면 안된다.
초등학교때 배웠던 덧셈 과정을 문자열로 하나하나 처리해서 수행해야 한다.
초등학교때 배웠던 덧셈 과정을 문자열로 하나하나 처리해서 수행해야 한다.
문자열 길이의 맨 마지막에 일의자리구삭 되고 그다음이 십의자리수가 되고 그런 식이다.
예를들어 "9236" + "1234" 를 하면
예를들어 "9236" + "1234" 를 하면
1. 일의자리수를 더한 값에서 6+4 = 10 1은 10의자리 더 할 때 몫으로 올리고 0을 일의자리에 써준다. -> 0
2 10의 자리수를 더할 때는 3+3 인데 일의자리수에서 올라온 1을 더 더해서 10의 자리수에 7을 써야 한다 . -> 70
3. 100의 자리수는 2+2 = 4 이고 십의자리수에서 올라온것이 없기 때문에 -> 470 이 된다.
4. 1000의 자리수는 9+1 = 10 이고 몫 1은 다음 자리수 계산때 사용하고 천의자리수에는 0을 쓴다 -> 0470
5. 문자열 길이만큼 모두 계산이 끝나면 최종적으로 올라온 몫을 1을 붙인다 -> 10470 이 된다.
2 10의 자리수를 더할 때는 3+3 인데 일의자리수에서 올라온 1을 더 더해서 10의 자리수에 7을 써야 한다 . -> 70
3. 100의 자리수는 2+2 = 4 이고 십의자리수에서 올라온것이 없기 때문에 -> 470 이 된다.
4. 1000의 자리수는 9+1 = 10 이고 몫 1은 다음 자리수 계산때 사용하고 천의자리수에는 0을 쓴다 -> 0470
5. 문자열 길이만큼 모두 계산이 끝나면 최종적으로 올라온 몫을 1을 붙인다 -> 10470 이 된다.
주의 할 점은 테스트케이스로 입력될 문자열의 길이가 서로 다른 경우도 있기 때문에 A, B 두개의 문자열중에서 더 긴거 만큼 계속 덧셈을 수행하고 만약 문자열 크기를 초과하는 경우는 앞자리수를 모두 0으로 간주한다.
예를들어 A = "12" B = "1" 이면 B = "01" 처럼 해주고 덧셈연산을 하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String []inputs = br.readLine().split(" ");
String A = inputs[0];
String B = inputs[1];
int len1 = A.length() - 1;
int len2 = B.length() - 1;
int remainder = 0 ;
StringBuilder builder = new StringBuilder();
while(len1 >= 0 || len2 >= 0) {
// 문자를 정수형으로 변경.
// 만약 현재 덧셀할 자리수를 초과 한경우 0 으로 간주한다.
int c1 = len1 < 0 ? c1 = 0 : A.charAt(len1) - '0';
int c2 = len2 < 0 ? c2 = 0 : B.charAt(len2) - '0';
int sum = c1+c2 + remainder;
// 자리수를 더한 값에서 몫은 다음 자리수 덧셈을 위해 저장해두고
// 나머지 값은 문자열에 추가해준다.
int c = sum%10;
remainder = sum/10;
builder.insert(0, c);
len1--;
len2--;
}
if(remainder > 0) {
builder.insert(0, remainder);
}
System.out.println(builder.toString());
}
}
Colored by Color Scripter
|
그러나 자바에서는 이런 큰 수자를 위해 BigInteger 를 클래스를 이미 제공해주고 있다.
BigInteger 를 사용하면 어떠한 큰 수라도 상관 없다.
다음은 BiInteger 를 이용하여 문제를 푼 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String []inputs = br.readLine().split(" ");
String A = inputs[0];
String B = inputs[1];
BigInteger a = new BigInteger(A);
BigInteger b = new BigInteger(B);
System.out.println(a.add(b).toString());
}
}
Colored by Color Scripter
|
'코딩테스트(Coding Test) > 백준(Baekjoon OJ)' 카테고리의 다른 글
백준 4150 - 피보나치 수 (BigInteger) (0) | 2019.07.03 |
---|---|
백준 9442 - Sort Me (정렬, 룩업테이블) (0) | 2019.07.03 |
백준 2947 - 나무조각 (버블정렬) (0) | 2019.07.03 |
백준 7785 - 회사에 있는 사람 (0) | 2019.06.28 |
백준 1620 - 나는야 포켓몬 마스터 이다솜 (0) | 2019.06.28 |