본문 바로가기
프로그래밍/C programming

[C언어] 달팽이수열 프로그래밍

by 졸린이 2020. 8. 11.
반응형

[C언어] 달팽이 수열 프로그래밍.

 

달팽이 수열이란 n*n정방행렬에 1행 1열부터 수가 1씩 증가하면서 뱅글뱅글 달팽이처럼 돌돌 말아져 있는 것을 의미한다.

 

백문이 불어일견 어떻게 생겨먹은 건지 한 번 봐보도록 하자.

 

예를 들어 3*3 행렬이라면 

1 2 3
8 9 4
7 6 5

이렇게 생긴것을 의미한다.

 

먼저 프로그램을 어떻게 짜야할지 생각해보면 행렬이니까 다중배열이며 반복문으로 배열에 값을 저장해나가면 되겠다.

 

코드를 한 번 살펴보자.

 

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
#include <Stdio.h>
//달팽이 수열
main() {
    int num, cnt = 0, x = 0, y = -1, f = 1, n;
    // num :입력값, cnt :대입값, x, y :행렬위치, f :증감부호, n :반복횟수(num값)
    int ar[50][50= { 0, };
    scanf("%d"&num);
 
    n = num;
 
    while (n > 0) {
        
        //열 증감 for문
        for (int i = 0; i < n; i++) {
            y += f;
            ar[x][y] = ++cnt;
        }
        n--;
        //행 한 줄 채우고 n 감소
        //행 증감 for문
        for (int i = 0; i < n; i++) {
            x += f;
            ar[x][y] = ++cnt;
        }
        //앞서 두 for문으로 증가하면서 값을 저장하였으므로 이제 감소하면서 값을 저장해야한다.
        f *= -1;
    }
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            printf("%4d", ar[i][j]);
        }
        printf("\n");
   }
}
cs

line 4 : 귀찮게 선언하는 게 많다. num은 몇 행렬로 할지 사용자가 입력하는 값이고, x, y는 행렬의 위치 값이다.

 

cnt는 배열에 값을 저장할 대입 값이다.

 

f는 행렬의 값을 저장해나갈 때 첫 줄은 y값만 증가시키고 그 후엔 x값만 증가 그 후에는 y값 감소 x값 감소 이렇게 반복할 때 사용하는 부호 값이다.

 

x, y는 0행 0열부터(프로그래밍에서 배열의 첫 번째 위치는 1이 아니라 0이다.) 값을 저장해야 하므로 x는 0으로 초기화, y는 -1로 초기화했다. line 15에 보면 y값은 1 증가시키고 시작하기 때문.

 

n은 num값을 저장한 값이다. 반복문에서 n을 감소해나가면서 반복해야 하는데 출력할 때는 온전한 n값이 필요하기 때문에 둘로 나눠둔 것이다.

 

line 6 : 배열 선언 [50][50]으로 선언했으나 필요한 만큼 지정해줘도 된다.

 

line 7 : num입력.

 

line 9 : num값 복사.

 

line 11 : n이 0이 될 때까지 반복한다.

 

line 14 : for문에서 먼저 열에 f값(1)을 더해서 한 칸씩 움직여 주면서 cnt를 증가시켜 저장해 간다.

 

line 18 : 한 줄(행)을 채우고 나서 n-1만큼 아래로 내려가면 되니 n값을 마이너스시킨다.

 

line 21 : 앞서 있던 for문과 마찬가지로 x에 f를 더해서 한 행씩 증가시켜 값을 저장해 나간다.

 

line 26 : while문 한 번 반복 후엔 행, 열을 감소시키면서 저장해야 하므로 f에 -1을 곱해서 방향을 바꿔준다.

 

while문을 다 돌면 행렬이 다 채워지게 되고 이제 처음 입력한 num으로 행렬을 출력시켜 주면 된다.

 

반응형

댓글