[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으로 행렬을 출력시켜 주면 된다.
'프로그래밍 > C programming' 카테고리의 다른 글
c언어 년도를 입력받아서 윤년, 평년을 판단하는 프로그램 (0) | 2021.08.21 |
---|---|
C언어 함수 기초 사용자 정의 함수, 함수정의, 리턴, 매개변수 (0) | 2020.08.14 |
C언어 마방진(magic square) 프로그래밍 (0) | 2020.08.10 |
c언어 다중배열 [3][2] 제곱과 세제곱을 저장하고, 출력하는 프로그램 (0) | 2020.07.31 |
c언어 1에서 1000사이 정수중 수를 구성한 개개의 수가 연속적으로 되어있는 수를 찾는 프로그램(for문, if~else문, break) (0) | 2020.06.16 |
댓글