Skip to main content

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으로 시작하지 않는다.

image.png


오답

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로 계산해서 런타임 에러가 발생했다.

image.png

해결방법:

  1. BigInteger 처리를 해 줘야 한다. (필수)
  2. 더 나아가서 만약 매개변수로 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로 잡아주면 백점만점짜리 코드이다.