본문 바로가기
알고리즘/[프로그래머스] JAVA

[코딩 기초 트레이닝] 두 수의 합

by 코딩맛집 2024. 2. 7.

문제 :

https://school.programmers.co.kr/learn/courses/30/lessons/181846

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

에러 :

class Solution {
    public String solution(String a, String b) {
        int a1 = Integer.parseInt(a);
        int a2 = Integer.parseInt(b);
        int sum = a1+a2;
        
        return a1+a2+"";
    }
}
int자료형으로는 큰 수를 담을 수 없어서 나는 에러.
Exception in thread "main" java.lang.NumberFormatException: For input string: "18446744073709551615"

 

해결 :

import java.math.BigInteger;

class Solution {
    public String solution(String bin1, String bin2) {
        BigInteger num1 = new BigInteger(bin1);
        BigInteger num2 = new BigInteger(bin2);
        
        BigInteger result = num1.add(num2);
        String answer = result.toString();
        
        return answer;
    }
}

BigInteger 클래스란?

매우 큰 값을 다루는 클래스( 정수의 크기에 제한을 두지 않음)

정수형으로 타입 변환이 필요하지 않고 문자열 형태로 숫자를 입력받아 내부적으로 해당 문자열을 정수로 변환하여 처리한다. 연산자를 사용하지 않고 각각 메서드를 사용한다.

 

+ : BigInteger sum = numA.add(numB);

- : BigInteger difference = numA.subtract(numB);

* : BigInteger product = numA.multiply(numB);

/,% : BigInteger division = numA.divide(numB);

 

다른 사람 풀이 :

class Solution {
    public String solution(String a, String b) {
        String answer = cal(a,b);
        return answer;
    }
    private static String cal(String a, String b){
        StringBuilder sb = new StringBuilder();
        int aIndex = a.length() - 1;
        int bIndex = b.length() - 1;
        int prevTemp = 0;
        while(aIndex >= 0 || bIndex >= 0){
            int temp = prevTemp;   
            if(aIndex >= 0){
                temp += Integer.parseInt(a.charAt(aIndex)+"") ;
            }
            if(bIndex >= 0){
                temp += Integer.parseInt(b.charAt(bIndex)+"");
            }
            sb.append(temp % 10);
            prevTemp = temp / 10;
            aIndex--;
            bIndex--;
        }
        if(prevTemp != 0){
            sb.append(prevTemp);
        }
        return sb.reverse().toString();
    }
}

 

공부 :

Integer.parseInt(x, y)

는 진수로 표현된 문자열을 정수로 변환할 때도 쓰인다.

x : 문자열 

y : 진법

단, x는 y에 지정한 진법에 맞춰서 표현된 진수 문자열이여야 한다.

 

문제에서 a와 b는 2진수 문자열이기때문에 y자리에 2를 넣어준다.

Intger.toBinaryString()메서드로 더한 값을 다시 2진수 문자열로 변환한 뒤 반환한다.

 

Integer.parseInt() vs Integer.valueOf() 차이

둘 다 문자열을 정수로 변환하는 메서드이다.
 
차이점은
1. 반환 유형

Integer.parseInt() 는 int값 반환

Integer.valueOf() 는 Integer 객체 반환

 

2. 예외 처리

Integer.parseInt()는 변환할 수 없는 문자열이 들어오면 'NumberForException'을 던진다.

Integer.valueOf() 는 변환이 실패하면 'NumberForException'을 던진다.

 

3. Auto-unboxing

Integer.valueOf()가 Integer 객체를 반환하므로, 이를 int값으로 자동으로 언박싱할 수 있다.

Integer.parseInt()는 int값을 반환하므로 언박싱이 필요없다.

 

4. 캐싱

Integer.parseInt()는 매번 새로운 int값을 생성하므로 캐싱되지 않는다.

Integer.valueOf() 는 내부적으로 IntegerCache에 캐싱된다. -128부터 127까지의 정수를 변환하는 경우, 캐시된 객체를 반환한다. 이는 == 연산자로 비교할 때 동일성을 보장한다.

 

진법이란 무엇인가?

수를 표현하는데 사용되는 기초의 수를 의미한다.

가장 흔히 쓰이는 진법은 10진법이다. 0~9까지 10개의 기초 수를 사용하여 수를 나타낸다. 이 외에도 2진법, 8진법, 16진법 등이 있다. 컴퓨터에서는 2진법이 사용되며, 웹 개발에서는 16진법이 자주 사용된다.

 

진수란 무엇인가?

해당 진법에서 사용되는 숫자의 개수를 의미한다.

10진법은 0~9까지 10개의 진수

2진법은 0과 1까지 2개의 진수

16진법은 0~9와 A~F까지의 16개의 진수