본문 바로가기

코딩테스트(Coding Test)/백준(Baekjoon OJ)

백준 10757 - 큰수 (문자열조작)

▷ 문제 : https://www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

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

www.acmicpc.net

Note
큰 수 문제는 입력되는 값이 정수형으로 처리할 수 있는 크기가 넘기 (0 < A,B < 1010000) 때문에 단순히 int sum = A + B 하면 안된다. 
초등학교때 배웠던 덧셈  과정을 문자열로 하나하나 처리해서 수행해야 한다.
문자열 길이의 맨 마지막에 일의자리구삭 되고 그다음이 십의자리수가 되고 그런 식이다. 
예를들어 "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 이 된다.

주의 할 점은 테스트케이스로 입력될 문자열의 길이가 서로 다른 경우도 있기 때문에 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
 
 
 
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
 
 
 
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