본문 바로가기

DEVELOP/Algorithm

[C] SW Expert Academy 문제풀이 :: 2005번

반응형


SW Expert Academy의 2005번 파스칼의 삼각형 문제풀이다. 이름 때문에 괜히 얼핏 어려워보이나 아주 간단한 규칙. 큰 무리없이 한 번에 풀었다.



문제


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5P0-h6Ak4DFAUq&categoryId=AV5P0-h6Ak4DFAUq&categoryType=CODE


파스칼의 삼각형이란 아래와 같은 규칙을 따른다.


1. 첫 번째 줄은 항상 숫자 1이다.


2. 두 번째 줄부터 각 숫자들은 자신의 왼쪽과 오른쪽 위의 숫자의 합으로 구성된다.


N을 입력 받아 크기 N인 파스칼의 삼각형을 출력하는 프로그램을 작성하시오.



풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <malloc.h>
 
int main() {
    int tc, n;
    char *numTemp;
    char numBox[10= { 0, };
 
    scanf("%d"&tc);
    
    for (int t = 0; t < tc; t++) {
        scanf("%d"&n);
        
        printf("#%d\n", t+1);
        
        for (int i = 0; i < n; i++) {
            numTemp = (char*)malloc(sizeof(char)*(i + 1));
            if (i == 0) {
                numTemp[0= 1;
            }
            else if (i == 1) {
                numTemp[0= 1;
                numTemp[1= 1;
            }
            else {
                numTemp[0= 1;
                for (int k = 0; k < i - 1; k++) {
                    numTemp[k + 1= numBox[k] + numBox[k + 1];
                }
                numTemp[i] = 1;
            }
 
            for (int j = 0; j < i + 1; j++) {
                numBox[j] = numTemp[j];
                printf("%d ", numBox[j]);
                if (j == i) {
                    printf("\n");
                }
            }
        }
    }
 
    return 0;
}
cs



표준입출력과 동적할당을 위해 <stdio.h>와 <malloc.h>를 불러온다.


테스트 케이스 tc와 파스칼의 삼각형을 만들기 위한 n을 선언한다.


n번째 줄을 생성하기 위해 필요한 포인터 변수 numTemp와 n번째 줄의 숫자의 집합을 의미하는 numBox 변수를 선언한다.


각각의 테스트 케이스에 대해 for문으로 루프를 돌려준다.


scanf로 파스칼의 삼각형의 크기 n을 입력받는다.


테스트 케이스의 번호인 t+1을 출력한다. t는 0부터 시작한다.


i=0부터 n보다 작을 때까지, 즉 n번 루프를 돌려준다. 매 단계는 파스칼 삼각형의 각 줄을 의미한다.


i=0일 때, 즉 첫번째 줄일 때는 원소가 1 하나다. numTemp의 0번 요소에 1을 대입한다.


j=0부터 1보다 작을 때까지, 즉 j=0에 대하여, numBox[0] = numTemp[0]을 대입한다. 즉 numBox는 {1,0,0,...,0}이 된다.


numBox[0]을 출력한다. j와 i가 같다면, 즉 각 줄의 개수만큼 프린트한다면 줄을 바꿔준다.


다시 for문의 처음으로 돌아와, 같은 방식으로 i=1일 때, 즉 두번째 줄에 대해서 0번과 1번 요소에 1을 대입해주고 각각 출력한다. 사실 이건 아래 else 부분에 통합해도 된다. 어차피 else에서도 첫 요소와 마지막 요소에 1을 대입해준다.


또 for문의 처음으로 돌아온다. i=2라면, 3번째 줄이므로 원소의 개수는 3개다. 처음과 마지막 요소에는 1을 넣어준다.


그리고 numTemp[k+1] = numBox[k] + numBox[k+1], 즉 현재 numBox는 지금 작업하고 있는 줄의 바로 윗 줄이므로, numTemp의 k+1번째 요소는 그 바로 위의 두 요소의 합, 즉 numBox[k] + numBox[k+1]이 되도록 만들어준다.


마찬가지 방식으로 numTemp 각각의 요소를 numBox에 집어넣고 출력한다. i=j일 때, 즉 각각 numBox의 요소가 모두 출력되었다면 줄을 바꿔준다.



반응형