백준 11050번 (이항 계수 1, C++, DP) [BAEKJOON]

이항 계수 1

https://www.acmicpc.net/problem/11050

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초256 MB42981277832398264.497%

예제 입력 1

5 2

예제 출력 1

10

출처

알고리즘 분류


이항정리의 개념과 팩토리얼을 구현하는 간단한 문제

https://ko.wikipedia.org/wiki/%EC%9D%B4%ED%95%AD_%EC%A0%95%EB%A6%AC <- 이항정리

이항정리를 모른다면 아래 동영상을 시청하여 개념을 잡는 것을 추천


통과된 코드

정의를 그대로 코드로 구현하였다.

#include <iostream>

using namespace std;

int N, K;

// 팩토리얼을 계산하는 함수
int factorial(int number)
{	
	int result = 1;
	for (int i = 1; i <= number; i++) {
		result = result * i;
	}

	return result;
}

int main()
{
	cin >> N >> K;
	cout << factorial(N) / (factorial(K) * factorial(N - K));
	return 0;
} 

이항정리의 개념을 알고 있다면 팩토리얼을 구현하고 계산하면 정답


DP문제를 위해서 알아야할 개념

#include <iostream>

using namespace std;

// arr[i][j] 
// i 총 숫자의 개수
// j 선택 개수
// i 개중 j개를 뽑았을때 조합 경우 수
int arr[11][11];

// DP 배열을 초기화 해주는 함수
void DP_Initialiaztion()
{
	for (int i = 1; i < 11; i++) {
		arr[i][1] = i; // i개 중 1개를 뽑는 경우의 수는 i개
		arr[i][0] = 1; // i개 중 1개도 선택하지 않는 경우의 수는 1개
		arr[i][i] = 1; // i개 중 i개를 선택하는 경우의 수는 1개
	}

}

int main()
{
	DP_Initialiaztion();

	return 0;
}

조합의 점화식

nCr = (n-1)Cr + (n-1)C(r-1) 

D[i][j] = D[i-1][j] + D[i-1][j-1]

위의 로직을 이용한 통과 코드

#include <iostream>

using namespace std;

// arr[i][j] 
// i 총 숫자의 개수
// j 선택 개수
// i 개중 j개를 뽑았을때 조합 경우 수
int arr[11][11];

// DP 배열을 초기화 해주는 함수
void DP_Initialiaztion()
{
	for (int i = 1; i < 11; i++) {
		arr[i][1] = i; // i개 중 1개를 뽑는 경우의 수는 i개
		arr[i][0] = 1; // i개 중 1개도 선택하지 않는 경우의 수는 1개
		arr[i][i] = 1; // i개 중 i개를 선택하는 경우의 수는 1개
	}

}

int main()
{
	int N, K;
	cin >> N >> K;
	DP_Initialiaztion();

	// 점화식으로 배열 완성하기
	// i가 2부터 시작하는 이유
	// i가 1일 경우는 초기화가 되어있음
	for (int i = 2; i <= N; i++) { 
		for (int j = 1; j < i ; j++) { // j 0 은 초기화가 되어있음
			arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
		}
	}

	cout << arr[N][K]; // 결과 출력하기

	return 0;
}

“백준 11050번 (이항 계수 1, C++, DP) [BAEKJOON]”에 대한 1개의 생각

  1. 핑백: 백준 11051번 (이항 계수 2, C++, DP) [BAEKJOON] - 어제와 내일의 나 그 사이의 이야기

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤