java
이항계수를 10007로 나눈 나머지를 구하는 프로그램
공백으로 나눠진 두 정수의 입력을 받기 위해 string tokenizer 클래스를 이용함
string tokenizer는 문자를 토큰화시킨다고 보면된다
공백 뿐 아니라 컴마, 특정 문자를 기준으로 분리할 수도 있다
공백을 기준으로 구분할 경우에는
StringTokenizer st = new StringTokenizer(문자열);
구분자가 따로 존재할 경우에는
StringTokenizer st = new StringTokenizer(문자열,구분자);
이렇게 구분된 두개의 토큰은 nextToken 함수를 이용하여 받을 수 있다.
파이썬에서 pop과 비슷한 기능인듯?
받은 토큰이 string타입이므로 paresInt를 이용해 int로 형변환을 시켜준다
pareslong
paresshort
paresfloat...등 존재함
입력받을 때마다 계속 조합 계산을 해주면 시간초과 오류가 발생하므로 한번 계산한 값을 이차원 배열에 저장해주고 그 값을 이용하도록 하였다
long보다 큰 크기의 자료형이 필요하여 BigInteger를 사용해주었는데, 어차피 10007로 나눈 값을 출력하는 문제였어서 더 작은 범위 내에서 저장하고 출력하는 방법도 있을 것 같음
import java.io.*;
import java.util.StringTokenizer;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
BigInteger[][] combination = new BigInteger[1001][1001];
for (int i = 0; i <= 1000; i++) {
combination[i][0] = BigInteger.ONE;
combination[i][i] = BigInteger.ONE;
for (int j = 1; j < i; j++) {
combination[i][j] = combination[i - 1][j].add(combination[i - 1][j - 1]);
}
}
BigInteger bigIntValue = new BigInteger(combination[a][b].toString());
BigInteger modValue = BigInteger.valueOf(10007);
BigInteger result = bigIntValue.mod(modValue); //
bw.write(result.toString());
bw.flush();
bw.close();
}
}