문제 출처: https://www.acmicpc.net/problem/11050
두 자연수의 이항계수를 구하는 프로그램을 작성하시오
이항계수 구하는 법: (N, K) 일때 N!/(K!(N-K)!)
5 2
10
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
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());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int result = 1;
for(int i = n - k + 1; i <= n; i++)
result *= i;
for(int i = 2; i <= k; i++)
result /= i;
br.close();
System.out.println(result);
}
}
//이항계수
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(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
// nCk = n! / ((n-k)! * k!)
System.out.println(factorial(N) / (factorial(N - K) * factorial(K)));
}
static int factorial(int N) {
// factorial(0) == 1 이다.
if (N <= 1) {
return 1;
}
return N * factorial(N - 1);
}
}
백준에 제출된 코드 줄 자바에서는 제일 빠른 코드이다.
정적 메소드를 사용하여 더 빠른것 같다.
정적 메소드를 사용하면 빠른 이유
JVM이 시작될때 static영역에 저장되어 프로그램이 끝날때까지 사라지지 않고 메모리에 남아있어서 실행될때 더 빠른것 같다.
코딩테스트에서는 효율도가 올라갈지 몰라도 정적 메소드의 잦은 사용은 객체 지향에서 멀어지고 메모리 효율이 떨어지는 단점이 있다고 한다.[출처]