59. [Java] 두 수의 합
https://school.programmers.co.kr/learn/courses/30/lessons/181846
- 0 이상의 두 정수가 문자열 a, b로 주어질 때,
- a + b의 값을 문자열로 return
- 1 ≤ a의 길이 ≤ 100,000
- 1 ≤ b의 길이 ≤ 100,000
- a와 b는 숫자로만 이루어져 있다.
- a와 b는 정수 0이 아니라면 0으로 시작하지 않는다.
오답
class Solution {
public String solution(String a, String b) {
int sum = Integer.parseInt(a) + Integer.parseInt(b);
return String.valueOf(sum);
}
}
입출력 예를 보면 int 범위 초과하는 큰 숫자가 들어오는 것을 확인할 수 있다. 문제에서 a랑 b의 길이 제한이 각각 10만이다. 이 말은 ab의 자릿수가 10만까지 들어날 수 있다는 것이다. 정수형 int는 21억까지 커버되고 자릿수로는 10글자정도이다. 그 이상은 처리할 수 없다. 나는 그냥 int로 계산해서 런타임 에러가 발생했다.
해결방법:
- BigInteger 처리를 해 줘야 한다. (필수)
- 더 나아가서 만약 매개변수로 String이 아닌 값 들어오면 예외가 날 수 있으므로 try-catch로 예외처리 해주면 더 좋다. (선택)
정답코드
import java.math.BigInteger;
class Solution {
public String solution(String a, String b) {
BigInteger bigA = new BigInteger(a);
BigInteger bigB = new BigInteger(b);
BigInteger sum = bigA.add(bigB);
return sum.toString();
}
}
큰 수를 계산할 때 안전하게 쓸 수 있는 것이 BigInteger이다. 길이가 최대 100,000자리인 숫자는 Integer.parseInt나 Long.parseLong으로도 처리를 못한다. BigInteger을 쓰면 내부적으로 큰 수 연산을 다 알아서 해주니까 직접 자리수 더하는 걸 구현할 필요가 없다. 이 때 BigInteger는 위와 같이 객체를 생성해서 쓰면 되고 BigInteger의 덧셈은 add() 메서드로 한다.
그리고 BigInteger은 java.math 패키지 안에 정의된 클래스이다. Math 클래스 안에 있는 게 아니라 java.math라는 패키지 안에 있는 독립 클래스라서 사용할 때 import java.math.BigInteger; 한 줄 써 주면 된다.
예외처리 추가한 코드
import java.math.BigInteger;
class Solution {
public String solution(String a, String b) {
try {
BigInteger bigA = new BigInteger(a);
BigInteger bigB = new BigInteger(b);
BigInteger sum = bigA.add(bigB);
return sum.toString();
} catch (NumberFormatException e) {
// 숫자가 아닌 입력이 들어온 경우 예외 처리
return "입력값이 올바른 숫자가 아닙니다.";
}
}
}
그리고 코테에서 필수적으로 해야하는 처리는 아니지만, 예외처리까지 하면 더 좋다. 입력값이 숫자가 아닌 문자열이 들어오면 NumberFormatException이 발생할 가능성이 있기 때문이다. 이 예외를 try-catch로 잡아주면 백점만점짜리 코드이다.