[백준 자바] 1271 엄청난 부자2 (BigInteger)

2023. 12. 12. 17:44
728x90

 

브론즈 5부터 차근차근 풀어보겠다고 처음 고른 문제로 1시간 넘게 싸우고 있을줄은....!!! 몰랐슴더

하지만,,, 나의 무지로 인한 것,,,! 하하

 

 

1. 입력 값은 조교가 가진 돈 n / 이 돈을 동일하게 분배받을 생명체의 수 m

2. 이걸 가지고 돈을 똑같이 분배하면 한사람당 얼마? + 그리고 남은 돈은 얼마? 

 

 

- 1차 풀이

첫 풀이는 이랬다 원가 BufferedReader가 빠르다 보니 이제는 이걸로 항상 쓰는데

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 엄청난 부자2
public class Main {
    public static void main(String[] args) throws IOException {
        // 돈을 똑같이 분배 + 동일하게 분배하고 남은 돈?
        // 조교가 가진 돈 n / 돈을 받으러 온 생명체의 수 m
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] brArray = br.readLine().split(" ");
        int n = Integer.parseInt(brArray[0]);
        int m = Integer.parseInt(brArray[1]);

        System.out.println(n/m);
        System.out.println(n%m);
    }
}

 

결과는 런타임 에러 (NumberFormat) 이었다.

넘버포맷이 뭐가 문제지 하고 문제 다시 살펴보다가 (1 ≤ m ≤ n ≤ 10^1000, m과 n은 10진수 정수) > 요 조건이 걸렸다.

int와 long은 커버하지 못하는 범위의 수다. 그래서 런타임 에러가 발생한 것.

 

그렇담 이걸 커버할 정도의 큰 숫자는 바로바로~

BigInteger / BigDecimal 

- BigInteger는 long으로도 다룰 수 없는 큰 범위의 정수

- BigDecimal은 double로도 다룰 수 없는 큰 범위의 부동 소수점수

* 숫자의 범위가 int, long을 넘을 경우는 잘 없겠지만 프로그램 개발 시/ 알고리즘 문제 풀이시 최악의 상황을 고려하려면 무한의 정수가 들어갈 수 있는 BigInteger 클래스를 활용하는 것이 좋다. (BigInteger는 문자열 형태로 이루어져 있어 무한의 숫자가 들어간다)

 

 

 

- 2차 풀이 

- BigInteger 사용시 연산을 위해서는 클래스 내부 메서드를  사용해야 한다.

덧셈 n.add(m);
뺄셈 n.substract(m);
곱셈 n.multiply(m);
나눗셈 n.divide(m);
나머지 n.remainder(m);

 

+ BigInteger 사용법 추가

더보기

+ BigIntger 두 수 비교 방법 : compareTo()

int compare = n.compareTo(m); //맞으면 0, 틀리면 -1

+ BigInteger 형 변환

BigInteger n = BigInteger.valueOf(100000); //int -> BigInteger

int intN = n.intValue(); //BigInteger -> int
long longN = n.longValue(); //BigInteger -> long
float floatN = n.floatValue(); //BigInteger -> float
double doubleN = n.doubleValue(); //BigInteger -> double
String stringN = n.toString(); //BigInteger -> String

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

// 엄청난 부자2
public class Main {
    public static void main(String[] args) throws IOException {
         // 돈을 똑같이 분배 + 동일하게 분배하고 남은 돈?
        // 조교가 가진 돈 n / 돈을 받으러 온 생명체의 수 m
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

       String[] brArray = br.readLine().split(" ");
        BigInteger n = BigInteger.valueOf(Integer.parseInt(brArray[0]));
        BigInteger m = BigInteger.valueOf(Integer.parseInt(brArray[1]));

        System.out.println(n.divide(m));
        System.out.println(n.remainder(m));

    }
}

 

> 어쩌구 저쩌구 인텔리제이가 추천하는 방식으로 BigInteger 선언하고 값을 넣어주었다. 

그러나 여전히 런타임 에러가 났다... 

 

여기서 중요한 것은 !
BigInteger는 문자열 형태이므로 !!!
BigInteger를 초기화하기 위해서는
문자열을 인자값으로 넘겨준다는 점.

 

 

엇 그럼 더 코드가 간단해진다ㅎㅎ

String배열에 저장한 각 문자열을 BigInteger값에 넣어주기만 하면 된다 

 

- 3차 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

// 엄청난 부자2
public class Main {
    public static void main(String[] args) throws IOException {
        // 돈을 똑같이 분배 + 동일하게 분배하고 남은 돈?
        // 조교가 가진 돈 n / 돈을 받으러 온 생명체의 수 m
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] brArray = br.readLine().split(" ");
        BigInteger n = new BigInteger(brArray[0]);
        BigInteger m = new BigInteger(brArray[1]);

        System.out.println(n.divide(m));
        System.out.println(n.remainder(m));
    }
}

 

이렇게 마지막 최종 코드가 나왔다. 

실행 결과 ~ 성공

+ 아래 결과는 Scanner 활용한 결과 (BufferedReader가 훨씬 빠르다..)

728x90

BELATED ARTICLES

more