기초 알고리즘
구슬을 나누는 경우의 수 구하기 - bigInteger 사용하기
leek94
2023. 12. 1. 19:41
문제 설명
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
1 ≤ balls ≤ 30
1 ≤ share ≤ 30
구슬을 고르는 순서는 고려하지 않습니다.
share ≤ balls
처음 생각한 식
class Solution {
public fac (int n){
if(n == 1){
return 1;
}else{
return n * fac(n-1);
}
}
public int solution(int balls, int share) {
if(balls == share || balls == 0){
return 1;
}
int answer = (fac(balls) / (fac(balls-share)*fac(share)));
return (int) answer;
}
}
그런데 테스트를 진행 했을때 몇개만 통과하고 실패가 나온다....
결국 다른 블로그를 찾아보니깐 숫자가 30개의 볼을 나눌 경우의 수에서 int의 수를 넘어서 그렇다고 한다.
심지어 Long으로도 안됨
그래서 bigInteger라는 값을 사용해서 풀어야 식이 풀린다는 것을 알게 되었다.
그런데 bigInteger가 값을 초기화 할때
BigInteger bigNumber = new BigInteger("12345");
이런식으로 값을 String으로 넣어 줘야 한다. 왜냐 하면 BigInteger가 문자열로 되어 있기 때문이다
문자열로 되어 있기 때문에 사칙 연산 사용시 메서드를 사용해서 처리를 해야 한다
BigInteger bigInteger1 = new BigInteger("12345");
BigInteger bigInteger2 = new BigInteger("54321");
System.out.println("덧셈(+) :" +bigInteger1.add(bigInteger2));
System.out.println("뺄셈(-) :" +bigInteger1.subtract(bigInteger2));
System.out.println("곱셈(*) :" +bigInteger1.multiply(bigInteger2));
System.out.println("나눗셈(/) :" +bigInteger1.divide(bigInteger2));
System.out.println("나머지(%) :" +bigInteger1.remainder(bigInteger2));
또한 형변환이 필요할때는 아래와 같이 가능하다
int int_bigNum = bigInteger.intValue(); //BigIntger -> int
long long_bigNum = bigInteger.longValue(); //BigIntger -> long
float float_bigNum = bigInteger.floatValue(); //BigIntger -> float
double double_bigNum = bigInteger.doubleValue(); //BigIntger -> double
String String_bigNum = bigInteger.toString(); //BigIntger -> String
마지막으로 두수를 비교 할때도 compare을 사용해서 비교를 할 수 있다.
BigInteger bigInteger1 = new BigInteger("12345");
BigInteger bigInteger2 = new BigInteger("123456");
int compare = bigInterger1.compareTo(bigInteger2);
// 값이 같으면 compare에 0 값이 틀리면 -1 값이 저장 된다.
이렇게 사용 가능한 bigInteger를 사용해서 위의 코드를 변경해주면
import java.math.BigInteger;
public class Solution {
public BigInteger fac(int n){
if(n <= 1){
return BigInteger.valueOf(n);
} else {
return BigInteger.valueOf(n).multiply(fac(n - 1));
}
}
public BigInteger solution(int balls, int share) {
if(balls == share || balls == 0) {
return BigInteger.ONE;
}
BigInteger numerator = fac(balls);
BigInteger denominator = fac(balls-share).multiply(fac(share));
BigInteger answer = numerator.divide(denominator);
return answer;
}
}
이렇게 사용해서 풀었습니다. 다른 분들의 코드를 참고해서 풀었습니다. 어렵네요 ㅠ