Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어로 파스칼 삼각형 출력하기: 팩토리얼과 조합을 활용한 두 가지 구현 방법


파스칼 삼각형(Pascal's Triangle)은 정수를 삼각형 형태로 배열한 것으로, 그중에서도 이항계수(binomial coefficient)를 표현하는 대표적인 예로 널리 알려져 있습니다. 조합(combination)과 팩토리얼(factorial)을 활용하면 C언어로 손쉽게 구현할 수 있습니다.

파스칼 삼각형의 구성 원리

삼각형 외부에 있는 모든 값은 0으로 간주합니다. 첫 번째 행은 '0 1 0'이지만 실제 파스칼 삼각형에는 1만 표시되고, 양옆의 0은 보이지 않습니다. 두 번째 행은 첫 번째 행의 인접한 값들을 더해 (0+1)과 (1+0)을 계산하여 만들어지며, 결과는 다시 두 개의 0 사이에 위치하게 됩니다. 이 과정을 원하는 층(row) 수만큼 반복하면 파스칼 삼각형이 완성됩니다.

프로그래밍 관점에서 파스칼 삼각형은 이전 행의 인접한 두 요소를 더하여 새로운 행을 만들어가는 배열로 정의할 수 있습니다.

C언어로 파스칼 삼각형 출력하기: 팩토리얼과 조합을 활용한 두 가지 구현 방법

방법 1: 팩토리얼 함수를 이용한 구현

첫 번째 방법은 팩토리얼을 직접 계산하는 함수를 만들어 조합 공식 nCr = n! / (r! × (n-r)!)을 적용하는 방식입니다. 각 행의 값을 조합 공식으로 구한 뒤, 삼각형 모양이 되도록 앞쪽에 공백을 출력합니다.

#include <stdio.h>
int fact(int);
int main(){
    int i,rows,j;
    printf("enter no of rows :");
    scanf("%d",&rows);
    for (i = 0; i < rows; i++){
        for (j = 0; j <= (rows- i - 2); j++)
            printf(" ");
        for (j = 0 ; j <= i; j++)
            printf("%d ",fact(i)/(fact(j)*fact(i-j)));
        printf("\n");
    }
    return 0;
}
int fact(int n){
    int a;
    int sum = 1;
    for (a = 1; a <= n; a++)
        sum = sum*a;
    return sum;
}

실행 결과

Enter no of rows :5
      1
     1 1
    1 2 1
   1 3 3 1
  1 4 6 4 1

방법 2: 배열 없이 이항계수를 순차적으로 계산하는 구현

두 번째 방법은 별도의 배열 없이, 한 행 내에서 이전 값을 재활용하여 다음 값을 구하는 방식입니다. 초기값 a=1에서 시작해 a = a × (row-i) / i 공식을 반복 적용하면 곱셈과 나눗셈만으로 각 자리의 이항계수를 효율적으로 계산할 수 있습니다.

#include<stdio.h>
int main(){
    int num,row,i;
    printf("Enter the number of rows: ");
    scanf("%d",&num);
    for(row=1; row<=num; row++){
        int a=1;
        for(i=1; i<=row; i++){
            printf("%d ",a);
            a = a * (row-i)/i;
        }
        printf("\n");
    }
    return 0;
}

실행 결과

Enter the number of rows: 6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

마무리

두 방식 모두 파스칼 삼각형을 출력한다는 동일한 목표를 가지지만, 방법 1은 조합 공식을 매번 계산하므로 코드가 직관적인 반면, 방법 2는 이전 결과를 활용해 연산량을 줄일 수 있어 더 효율적입니다. 초보자라면 먼저 팩토리얼 기반 방식으로 원리를 익힌 후, 최적화된 방식으로 발전시켜 보는 것을 추천합니다.