Home > Backend > AnD > [AnD] 두 수의 합.

[AnD] 두 수의 합.
Algorithm DataStructure

문제 설명 🤓

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 인스턴스 number1number2 를 생성합니다.

  • 이들은 문자열로부터 생성되며, 매우 큰 수를 나타낼 수 있습니다.

2. add 메소드를 사용하여 number1number2 를 더합니다.

  • 이 메소드는 두 수의 합을 나타내는 새로운 BigInteger 객체를 반환합니다.

3. 덧셈 결과를 출력합니다.

BigInteger 를 사용하면 정수의 범위에 제한 없이 수학적 연산을 수행할 수 있어, 매우 큰 수를 처리해야 할 때 유용합니다.