[필수 문제] 큰 자릿수 뺄셈

2021. 2. 13. 02:39코딩 테스트/필수 문제

1. 문제

두 자연수가 주어질 때 그들의 뺄셈을 계산하는 프로그램을 작성하시오. 각 수는 1 이상 10의 100승 미만의 범위를 가진다.  


입력

첫 번째 줄과 두 번째 줄에 각각 하나의 자연수가 주어진다. 

출력

첫 번째 줄에 뺄셈의 결과를 출력한다.  

예제 입력

case 1)

1962831868293922
2528838232

 

case 2)

18592918185
2195812983912895799129

예제 출력

case 1) 1962829339455690

case 2) -2195812983894302880944

 

 

 

2. 풀이

큰 자릿수 뺄셈은 자바에서 문자열을 다루는 부분이 까다롭다는 점이 가장 큰 문제이다. 이 부분만 주의한다면 문제의 해답은 쉽게 구할 수 있다.

 

추가적으로 3개의 테스트 케이스를 넣어서 확인해보는 것이 좋다.

 

case 1)

100000000

1

 

case 2)

1

100000000

 

case 3)

100000000

100000000

 

package org.example;

import java.io.*;

public class Main {

    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        String[] s1 = br.readLine().split("");
        String[] s2 = br.readLine().split("");

        int maxLen = Math.max(s1.length, s2.length);
        int[] n = new int[maxLen];
        int[] m = new int[maxLen];

        // 자릿수 통일
        for(int i = 0; i < maxLen; i++) {
            // i가 s1의 크기보다 작을 경우, n 배열의 마지막 요소에 s1의 마지막 요소를 넣는다.
            if(i < s1.length) n[maxLen - 1 - i] = Integer.parseInt(s1[s1.length - 1 - i]);
            else n[maxLen - 1 - i] = 0; // s1의 자릿수가 최대 크기를 만족하지 못하기에 0을 앞에 채운다.

            // i가 s2의 크기보다 작을 경우, m 배열의 마지막 요소에 s2의 마지막 요소를 넣는다.
            if(i < s2.length) m[maxLen - 1 - i] = Integer.parseInt(s2[s2.length - 1 - i]);
            else m[maxLen - 1 - i] = 0; // s2의 자릿수가 최대 크기를 만족하지 못하기에 0을 앞에 채운다.
        }

        // n-m을 하는 과정에서, n이 클경우 양수, m이 클 경우 음수를 판별
        boolean isPositive = false;
        int count = 0;
        while(count < maxLen) {
            if(n[count] > m[count]) {
                isPositive = true;
                break;
            }
            if(n[count] < m[count]) {
                isPositive = false;
                break;

            }
            count++;
        }

        if(count == maxLen) { // n과 m이 모두 0일 경우
            bw.write("0");
        } else {
            int[] result = new int[maxLen];
            for(int i = maxLen - 1; i >= 0; i--) {
                if(isPositive) { // 양수일 경우
                    result[i] += n[i] - m[i];
                } else { // 음수일 경우
                    result[i] += m[i] - n[i];
                }

                // 두 수의 차가 음수일 경우 앞자리에서 빌려와 계산
                if(result[i] < 0) {
                    result[i] += 10;
                    result[i-1]--;
                }
            }

            // 출력 시 불필요한 0을 없애기 위해 가장 앞자리에 0이 어디까지 있는지 판별
            int zero = 0;
            while(result[zero] == 0) {
                zero++;
            }

            // 음수일 경우 출력시 '-' 추가
            if(!isPositive) bw.write("-");

            for(int i = zero; i < maxLen; i++) {
                bw.write(result[i] + "");
            }

        }

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

}
728x90

'코딩 테스트 > 필수 문제' 카테고리의 다른 글

[필수 문제] 순열 구하기  (0) 2021.02.13
[필수 문제] 팩토리얼  (0) 2021.02.13
[필수 문제] streetree  (0) 2021.02.13
[필수 문제] k번째 큰 수 찾기  (0) 2021.02.13