[백준 자바] 1271 엄청난 부자2 (BigInteger)
브론즈 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가 훨씬 빠르다..)
'Coding test > 코딩테스트' 카테고리의 다른 글
[백준 자바] 11650 좌표 정렬하기 (0) | 2023.12.18 |
---|---|
[백준 자바] 1260 DFS와 BFS (0) | 2023.12.12 |
Stack 스택 / 괄호검사 / DFS / 후위표기법 (5) | 2023.12.06 |
연습용 (1) | 2023.12.05 |
[백준 자바] 2562 최댓값 (Scanner/ BufferedReader) (0) | 2023.11.29 |