이항계수.. 고등학교 수학에서도 어려웠는데
백준 문제에서 나왔을때 뜨억!! 하고 놀랐다
굳어버린 머리를 일깨워서 다시 정리해보면
이항정리가 어려웠던 것 같기도 하고..? ..??
아무튼 이항계수는 집합에서 원소를 선택하는 경우의 수이다.
이항계수는 다음과 같은 특징을 가진다.
- 순서가 중요하지 않음
- 중복 선택 불가
- 팩토리얼을 이용하여 계산
프로그래밍 사용 예시
확률 계산 | 사건이 일어날 확률 계산 ex) 주사위를 던져 3번 이상 5가 나올 확률 계산 |
통계 분석 | 특정 조건을 만족하는 데이터 선택, 가능한 조합의 수 계산 |
동적계획법 | 중복 계산을 피하기 위해 이항 계수를 미리 사용하여 값을 미리 계산한다 |
동적계획법
복잡한 문제를 간단한 하위 문제로 나누어 풀고 그 결과를 저장해 동일한 하위문제에 재활용하는 알고리즘 설계 기법이다.
최적화 문제나 최단 경로 문제를 푸는데 사용된다.
주요 특징
1. 메모이제이션
계산한 결과를 배열이나 다른 자료구조에 저장에 두었다가 필요할 때 가져와 사용한다.
이를 통해 중복 계산을 피하고 실행 시간을 단축시킨다.
2. 최적 부분 구조
큰 문제의 최적해를 그 하위 문제들의 최적해를 합친 것으로 구성한다. 이 식이 충족될 때 까지
동적 계획법을 적용시킨다.
3. 점화식
문제를 작은 하위 문제로 분할하고 하위 문제들 간의 관계를 수식으로 표현한다.
동적 계획법에서는 점화식을 사용하여 문제를 해결한다.
자바 코드 예시
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BinomialCoefficientExample {
// 정수 n의 팩토리얼 계산 함수
public static long factorial(int n) {
if (n == 0 || n == 1) {
return 1; // 0 또는 1의 팩토리얼은 1이므로 바로 반환
}
long result = 1;
for (int i = 2; i <= n; i++) {
result *= i; // 2부터 n까지의 곱을 계산하여 팩토리얼 구함
}
return result; // 결과 반환
}
// 이항 계수 계산 함수
public static long binomialCoefficient(int n, int k) {
if (k < 0 || k > n) {
return 0; // k가 범위를 벗어나면 계산 불가능하므로 0 반환
}
// n! / (k! * (n-k)!)
long numerator = factorial(n); // 분자 계산: n!
long denominator = factorial(k) * factorial(n - k); // 분모 계산: k! * (n-k)!
return numerator / denominator; // 이항 계수 반환
}
public static void main(String[] args) throws IOException {
// BufferedReader를 사용하여 입력을 받음
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//n과 k를 입력받음
int n = Integer.parseInt(br.readLine());
int k = Integer.parseInt(br.readLine());
// 이항 계수 계산
long result = binomialCoefficient(n, k);
System.out.println(result);
br.close();
}
}
'자료구조 > 알고리즘 기초수학' 카테고리의 다른 글
Hash Table / Deque (5) | 2024.07.16 |
---|---|
선형 자료구조 스택, 큐, 리스트 (0) | 2024.07.08 |
유클리드 호제법 (0) | 2024.07.04 |
에라토스테네스의 체 (1) | 2024.07.02 |
알고리즘 / 문자열 (1) | 2024.07.01 |