문제 설명 🤓
0 이상의 두 정수가 문자열 a, b
로 주어질 때, a + b
의 값을 문자열로 return
하는 solution
함수를 작성해 주세요.
솔루션 📝
import java.math.BigInteger;
class Solution {
public String solution(String a, String b) {
String answer = "";
BigInteger bigNumberA = new BigInteger(a);
BigInteger bigNumberB = new BigInteger(b);
answer = bigNumberA.add(bigNumberB).toString();
return answer;
}
}
트러블슈팅 🏀
1. NumberFormatException
에러(1).
입출력의 예시 중 가장 긴 입력 예시인 a : “18446744073709551615”, b : “305793246910280479981” 에서 에러가 발생 했습니다.
1️⃣ 콘솔에 나타난 에러 메시지
콘솔에 나타난 에러 메시지는 아래와 같았습니다.
Exception in thread "main" java.lang.NumberFormatException: For input string: "18446744073709551615"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:662)
at java.base/java.lang.Integer.valueOf(Integer.java:989)
at programmers.test1.Solution.solution(Solution.java:8)
at programmers.test1.SolutionMain.main(SolutionMain.java:7)
Process finished with exit code 1
2️⃣ 본격적인 트러블슈팅
이 메시지를 하나씩 해석하고 트러블슈팅을 이어갔습니다.
먼저 이 오류 메시지는 NumberFormatException
이 발생했다는 것을 나타냅니다.
- 특히 “For input string: “18446744073709551615”는 Java에서 정수로 변환하려는 문자열이 정부 범위를 벗어났음을 의미합니다.
Java의 Integer.parseInt()
메소드는 문자열을 정수(Int
)로 변환할 때 사용됩니다.
- 그러나
Int
자료형은 -2,147,483,648,648 부터 2,147,483,648,647까지의 값을 저정할 수 있습니다.- 제공된 문자열 “18446744073709551615”는 이 범위를 훨씬 초과합니다.
3️⃣ 해결 방법
이 문제를 해결하려면 다음과 같은 방법을 고려할 수 있습니다.
1. 타입 변경
-
int
대신long
타입을 사용하거나, 이보다 더 큰 범위가 필요하다면,BigInteger
클래스를 사용할 수 있습니다. -
long
의 범위는 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807 까지입니다.
2. 입력 검증
- 입력 값이 정수 타입으로 변환 가능한지, 그리고 해당 타입의 범위 내에 있는지 검증하는 로직을 추가합니다.
코드를 수정할 때는 적절한 데이터 타입을 사용하도록 주의해야 합니다.
예를 들어,long
으로 변경하려면Long.parseLong()
을 사용할 수 있습니다.
2. NumberFormatException
에러(2)
이번에는 위의 트러블슈팅을 활용하여 코드를 만든 결과 NumberFormatException
에러를 다시 발생 시킨 케이스 입니다.
- 이번에는
Long.parseLong()
메소드를 사용하면서 발생했습니다.- 문자열 “18446744073709551615”는 이번에도 범위를 벗어난 값으로 처리되었습니다.
long
자료형의 최대값은 9,223,372,036,854,775,807dlqslek.
- 제공된 값 “18446744073709551615”는 이 최대값을 초과합니다.
- 따라서,
long
으로도 처리할 수 없으며, Java에서 이러한 큰 숫자를 다루려면BigInteger
클래스를 사용해야 합니다.-
BigInteger
는 사실상 제한 없는 정밀도의 정수를 다룰 수 있어 이와 같은 큰 숫자를 취급할 때 유용합니다.
-
- 따라서,
BigInteger
를 사용하는 예시 코드.
import java.math.BigInteger;
public class Solution {
public void solution(String input) {
BigInteger bigNumber = new BigInteger(input);
// bigNumber를 사용한 다른 로직
}
}
public class SolutionMain {
public static void main(String[] args) {
new Solution().solution("18446744073709551615");
}
}
- 이 코드는
BigInteger
를 사용하여 입력된 숫자를 처리하고, 필요한 로직을 수행할 수 있도록 구성되어 있습니다.
3. BigInteger
클래스를 사용하여 두 큰 정수를 더하는 방법.
두 문자열을 받아 큰 범위의 문자열을 BigInteger
클래스를 사용하여 받아오고 변환하는 데 까지는 성공하였으나 입력된 두 개의 큰 범위 값의 BigInteger
를 어떻게 합쳐야 할지를 몰라 검색해 봤습니다.
1️⃣ Java에서 BigInteger
클래스를 사용하여 두 큰 정수를 더하는 방법
-
BigInteger
클래스는 불변(immutable) 객체 이므로 두BigInteger
인스턴스를 더할 때, 새로운BigInteger
객체가 반환됩니다.
2️⃣ BigInteger
객체를 더하는 방법 예시 코드
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
// 두 큰 수를 BigInteger로 생성
BigInteger number1 = new BigInteger("12345678901234567890");
BigInteger number2 = new BigInteger("98765432109876543210");
// 두 수를 더함
BigInteger sum = number1.add(number2);
// 결과 출력
System.out.println("Sum: " + sum.toSting())
}
}
이 코드는 다음과 같은 단계를 거칩니다.
1. 두 개의 BigInteger
인스턴스 number1
과 number2
를 생성합니다.
- 이들은 문자열로부터 생성되며, 매우 큰 수를 나타낼 수 있습니다.
2. add
메소드를 사용하여 number1
과 number2
를 더합니다.
- 이 메소드는 두 수의 합을 나타내는 새로운
BigInteger
객체를 반환합니다.
3. 덧셈 결과를 출력합니다.
BigInteger
를 사용하면 정수의 범위에 제한 없이 수학적 연산을 수행할 수 있어, 매우 큰 수를 처리해야 할 때 유용합니다.