[필수 문제] 큰 자릿수 뺄셈
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 |