programming language/Java

BigInteger 사용하기

공대키메라 2022. 1. 18. 00:57

leetcode 에서 문제를 푸는중 문제가 하나 발생했다.

 

문제푸는중...

 

링크 : https://leetcode.com/problems/plus-one/

 

해당 문제는 int배열을 변환하는 것인데

 

필자는 string으로 전부 성분을 하나의 문자열로 합쳐서 다시 int 배열로 만드는 작업을 시행했는데 

 

이를 시행하는 와중에 int형의 범위를 벗어나는 문제를 겪었다. 

 

import java.math.BigInteger;
class Solution {
    public int[] plusOne(int[] digits) {
        if(digits == null || digits.length == 0) return null;
        String stringNum = "";
        for(int component : digits){
            stringNum += Integer.toString(component);
        }
        
        int resultNum = Integer.parseInt(stringNum) + 1;
        int[] resultArray = Stream.of(String.valueOf(resultNum).split("")).mapToInt(Integer::parseInt).toArray();
        
        return resultArray;
    }
}

 

처음에는 왜 문제가 생겼지? 했는데 결국 수용할 수 있는 범위를 넘었기 때문이었다. 

 

출처 : https://linuxism.ustd.ip.or.kr/1523

 

[9,8,7,6,5,4,3,2,1,0] 을 입력하면 원하는 결과값은 [9,8,7,6,5,4,3,2,1,1]이 되어야 하는데

 

내가 만든 코드는 배열을 일일이 합쳐서 int로 파싱하는 과정에서 범위를 이미 넘어버리고 말았다. 

 

그래서 찾아보니 BigInteger를 이용하면 이것도 커버가 가능하다고 한다. 

 

근데 BigInteger의 사용법을 몰라서 한번 정리하고자 한다. 

 

BigInteger는 JDK 1.1에서 처음 소개된 기능이라고 한다. 

 

 

여기 bigInteger를 열어보면 많은 기능들이 있다. 

 

intValue, byteValue, doubleValue 하는 것들은 누가 봐도 int형의 값으로 반환, byte형의 값으로 반환, double형의 값으로 반환 하는 등의 기능이다. 

 

add도 있고, multiply도 있고, devide도 있고 여러가지 수학적 계산을 제공한다. 

 

좀 더 자세하게 보고 싶은 분은 여기 참고 링크를 보면 좋다. 

출처 : https://coding-factory.tistory.com/604

 

그러면 이것으로 어떻게 작성해야 하나?

 

import java.math.BigInteger;
class Solution {
    public int[] plusOne(int[] digits) {
        BigInteger one = new BigInteger("1");
        BigInteger ten = new BigInteger("10");
        BigInteger result = new BigInteger("0");
        for(int digit : digits){
            result = result.multiply(ten).add(BigInteger.valueOf(digit));
        }            
        String sResult = result.add(one).toString();
        
        return Stream.of(sResult.split("")).mapToInt(Integer::parseInt).toArray();
    }
}

 

BigInteger 를 String으로 한 번 변환한 후에 다시 int의 배열로 만드는 작업을 시행했다. 

 

찾아보니 mapToInt를 사용하면 Stream의 성분들을 전부 int로 만들게 된다. 그리고 배열로도 반환할 수 있다. 

 

이게 후... 코테가 참 재미있으면서도 어렵네... 

 

 

현재 하다가 모르면 남의 것을 보고 공부하는데 심지어 올린 답들도 이해가 잘 안되는 경우가 있어서

 

이렇게 물어보는 경우도 비일비재하다.

 

지금은 남이 짠 코드를 많이 참고하지만 나중에는 꼭 혼자 할 수 있을거라 믿는다. ㅠㅠ

'programming language > Java' 카테고리의 다른 글

제네릭 이해하기  (2) 2022.03.26
interface vs abtract class  (4) 2022.02.06
Jar 과 War의 차이점은?  (0) 2022.01.16
HashTable, HashMap, ConcurrentHashmap  (2) 2022.01.10
DTO? VO? 개념 정리 및 사용 이유  (3) 2021.08.29