백준 알고리즘 16395번 : 파스칼의 삼각형

Zoo Da·2021년 5월 17일
0

백준 알고리즘

목록 보기
17/337
post-thumbnail

문제 링크

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

제한

문제

파스칼의 삼각형은 이항계수를 삼각형 형태로 배열한 것인데, 블레즈 파스칼(1623-1662)을 따라 이름 붙여졌다.

단순한 형태로, 파스칼의 삼각형은 다음과 같은 방법으로 만들 수 있다.

N번째 행에는 N개의 수가 있다.
첫 번째 행은 1이다.
두 번째 행부터, 각 행의 양 끝의 값은 1이고, 나머지 수의 값은 바로 위 행의 인접한 두 수의 합이다.
예를 들어, n=3이면 3번째 행의 2번째 수는 위 행의 인접한 두 수 (1과 1)을 더해서 만든다.

n=6일 때, 파스칼 삼각형의 6번째 행의 10은 5번째 행의 인접한 두 수(4와 6)을 더해서 구한다.

같은 방식으로 n=11일 때, 다음과 같은 파스칼의 삼각형을 만들 수 있다.

정수 n과 k가 주어졌을 때 파스칼의 삼각형에 있는 n번째 행에서 k번째 수를 출력하는 프로그램을 작성하시오. 이때, 이 수는 이항계수 C(n-1,k-1)임에 주의하시오.

입력

첫째 줄에 정수 n과 k가 빈칸을 사이에 두고 차례로 주어진다. 이 때, 1 ≤ k ≤ n ≤ 30을 만족한다.

출력

첫째 줄에 n번째 행에 있는 k번째 수를 출력한다.

예제 입력 및 출력

풀이

  1. 문제에서 n-1Ck-1을 구하라고 하였으니 그냥 조합의 정의를 이용해서 구하면 된다
    n-1Ck-1 = n! / k!*(n-k)!으로 구할 수 있다.

  2. 팩토리얼을 재귀함수 방식을 활용해서 각각의 팩토리얼 값을 구하고 그 값을 바탕으로 조합 정의를 이용해서 답을 출력하면 된다.

  3. long long자료형을 사용하였으니 틀렸습니다가 뜨길레 double로 바꾸어서 계산하였다.

풀이 코드

#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS

double fact(int n){
  if(n == 0){
    return 1;
  }
  return n*fact(n-1);
}

double combi(int n,int k){
  return fact(n) / (fact(k) * fact(n-k));
}

int main(){
  int n,k;
  scanf("%d %d",&n,&k);
  printf("%.lf",combi(n-1,k-1));
  return 0;
}

복기

어려운 것은 없는 문제였지만 자료형이 계속 틀린다...

profile
메모장 겸 블로그

0개의 댓글