celina의 이것저것

[C++] 백준 11050번 - 이항 계수1 본문

자료구조&알고리즘/백준

[C++] 백준 11050번 - 이항 계수1

celinayk 2023. 3. 12. 17:22
반응형

문제

자연수 N과 정수 K가 주어졌을 때 이항 계수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N≤ 10, 0 ≤ K≤ N)

출력

(NK)를 출력한다.

접근

조합을 구하는 문제이다. 조합을 구하는 공식은 이렇다

nCk = n!/k!(n-k)!

반복문을 이용하는 방법과 재귀함수를 이용하는 방법이 있는데 둘다 풀어봤따!

코드

//////////1. 재귀함수를 이용한 방법

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#include <algorithm>
#include <string>
#include <vector>
#include <math.h>
#include <cmath>
using namespace std;

int fac(int num) {
    if (num == 0 || num ==1) {
        return 1;
    }
    else {
        return fac(num - 1) * num;
    }
}

int main() {

    int n, k;
    scanf("%d %d", &n, &k); //nCk구하기

    printf("%d", fac(n) / (fac(k) * fac(n - k)));
  
    return 0;
}

리뷰

조합을 구하는 공식에 팩토리얼이 들어간다 이 팩토리얼을 구하는 함수를 만들어서 최종 출력값에 조합을 구하는 공식을 쓰면 된다

재귀함수를 써서 팩토리얼을 구했다

재귀함수니까 num=3일때 num=2일때를 적어서 풀면 금방 알 수 있다 근데 난 재귀는 늘 헷갈린다. 그래서 아예 적어서 풀어보는편

 

코드

//////////2.반복문으로 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#include <algorithm>
#include <string>
#include <vector>
#include <math.h>
#include <cmath>
using namespace std;

int fac(int num) {

    int result = 1;

    for (int i = num; i > 0; i--) {
        result *= i;
    }
    return result;

}


int main() {

    int n, k;
    scanf("%d %d", &n, &k); //nCk구하기

    printf("%d", fac(n) / (fac(k) * fac(n - k)));


    
    return 0;
}

리뷰

반복문으로 팩토리얼을 구한다. 이것도 그냥 하나씩 적으면서 풀면 쉽게 알 수 있다

 

출처 

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

 

11050번: 이항 계수 1

첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

 

Comments