본문 바로가기
Programming Language/JAVA

[자바] BigInteger 문제(feat. 백준 1271번)

by NeoGul.S 2021. 7. 24.

나의 자랑스러운 칭구를 통해 solved.ac(https://solved.ac/problems/level)를 알게 되었고 나도 해봐야겠다는 생각이 들어 오늘부터 문제풀이를 시작했다.

 

이 사이트가 사실 백준 알고리즘 사이트와 연동? 되어있는 사이트라 이전에 풀었던 문제들도 해결이 된 상태로 있어서

오늘 리뷰할 문제로 바로 넘어갔다.

 

오늘의 문제~는 

 

엄청난 부자2 (https://www.acmicpc.net/problem/1271)

 

갑부 최백준 조교는 동전을 최소로 바꾸는데 성공했으나 김재홍 조교가 그 돈을 발견해서 최백준 조교에게 그 돈을 나누자고 따진다.

그 사실이 전 우주로 알려지자 우주에 있던 많은 생명체들이 자신들에게 돈을 분배해 달라고 당장 달려오기 시작했다.

프로토스 중앙 우주 정부의 정책인, ‘모든 지적 생명체는 동등하다’라는 규칙에 입각해서 돈을 똑같이 분배하고자 한다.

한 생명체에게 얼마씩 돈을 줄 수 있는가?

또, 생명체들에게 동일하게 분배한 후 남는 돈은 얼마인가?

 

사실 문제의 내용만 대강 읽어보면 별거 없어보인다

 

이거 뭐 나누기, 나머지 구하고 출력하면 되지 않을까 싶었다.

 

그런데...

 

연이은 InputMismatch 오류

아니 런타임 오류라니... 이클립스에서 예시 입력처럼 해도 잘 나왔는데...

 

하지만 나처럼 이 문제에서 어려움을 겪는 이들이 좀 있었던지 InputMismatch만 검색했더니 문제&해결점을 찾을 수 있었다.

 

10^1000까지 입력이 되야하는 조건이 있기 때문에 long 타입으로도 입력 받을 수 가 없었던 것

 

그렇다면 어떻게 해야하는 것인가!

 

BigInteger를 소환해야 한다

 

일단 내가 한 풀이를 보자

우선 부끄러운 나으 풀이...

 

일반적인 변수 선언 및 값 할당과는 달리 변수 선언 및 연산 수행시 객체 생성,메소드와 같은 과정을 거쳐야 한다

 

ex)

int a = 10;

-> BigInteger a = new BigInteger("100000000000000"); //입력시 문자열처럼 " "을 씌어서 해줘야함

 

연산 또한 일반적인 연산(+,-,*,/,%)이 아니라 BigInteger 안의 메소드를 써줘야한다!

 

메소드 기능 예시
add() 더하기 bi1.add(bi2)
substract() 빼기 bi1.substract(bi2)
multiply() 곱하기 bi1.multiply(bi2)
divide() 나누기(몫) bi1.divide(bi2)
remainder() 나머지 bi1.remainder(bi2)
gcd() 최대공약수 bi1.gcd(bi2)

이 외에도 다양한 메소드들이 있다..

 

표의 예시를 보면 알겠지만  연산하려는 개체.메소드(피연산 개체)로 구성됨을 알 수 있다.

-> bi1.add(bi2)의 경우는 bi1+bi2 가 되는 것

 

BigInteger를 자세히 보지 않아 상세한 설명이 불가하지만 해당 문제를 해결하기 위해 사용법을 조금 기술해보았다.

 

공부한 것을 잊지 않기 위해 서술해 놓은 것이라 부족한 점이 많지만 도움이 되었으면 한다