C언어 마방진(magic square) 프로그래밍
마방진. magic square라고도 한다.
N*N 정방 행렬의 행의 합, 열의 합, 대각선의 합이 모두 같은 값을 갖는 사각형을 말한다.
이 글에서는 홀 수 마방진을 프로그래밍을 알아본다.
위의 그림처럼 출력하도록 하는 것인데 마방진을 만드는 방법은 의외로 간단하다.
1. 첫 번째 줄(행)의 가운데에 1을 집어넣는다.
2. 두 번째 값부터 한 칸 왼쪽 한 칸 위로 자리를 옮겨서 1씩 증가시켜서 집어넣는다.
(맨 윗줄 다음 자리는 맨 아래이며 맨 왼쪽 다음 자리는 맨 오른쪽이다.)
3. 다음 넣을 자리에 이미 값이 들어가 있으면 x축을 한 칸 아래로 옮겨서 집어넣는다.
1 | ||
3 | ||
2 |
위 설명대로 3*3 행렬이라 쳤을 때 1을 먼저 맨 윗줄 가운데 집어넣고 맨 윗줄 자리 다음인 맨 아래로 칸을 옮기고
y축은 왼쪽으로 옮겨서 2를 집어넣는다. 마찬가지로 왼쪽 위칸인 2행 3열 자리에 3을 넣는다.
규칙대로는 다음에 넣을 자리는 1행 2 열인데 이미 1이 들어와 있으므로 x축만 하나 아래로 옮겨서 4를 넣으면 된다.
그러니까 현재 위치가 2행 3 열이니 x축을 아래로 옮기면 3행 3열에 4를 넣어야 하는 것이다.
1 | 7 | |
3 | ||
2 | 4 |
이렇게 값을 넣고 규칙을 반복하면 마방진이 완성된다.
언뜻 보면 복잡하다고 생각할 수도 있는데 for문과 if문으로 간단하게 프로그래밍할 수 있다.
코드를 한 번 살펴보도록 하자.
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
|
#include<stdio.h>
main() {
int n, x, y;
int a[50][50] = { 0, };
printf("input number : ");
scanf("%d", &n);
x = 0;
y = n / 2;
for (int i = 1; i <= n * n; i++) {
a[x][y] = i;
if (i%n == 0)
x++;
else {
x--;
y--;
if (x < 0)
x = n - 1;
if (y < 0)
y = n - 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
}
|
cs |
line 5 : 행렬 a의 크기를 [50][50]으로 잡고 0으로 초기화시킨다. (행렬 크기는 필요한 만큼 자유롭게 잡으면 된다.)
line 8 : 행렬의 크기를 n변수에 입력해 넣는다.
line 10, 11 : 첫 번째 값 1을 넣을 자리를 0행(프로그래밍에서는 배열의 첫 번째 자리는 1이 아닌 0부터 센다.)
n/2(가운데)로 잡는다.
line 13 : 1부터 n*n값만큼 집어넣으니 그만큼 for문으로 반복한다.
line 14 : 값을 넣는다.
line 16 : 이 부분은 다음 자리에 값이 들어가 있는지를 검사하는 건데 i가 n으로 나눠 떨어지면 다음 자리에는 값이
들어가 있음을 뜻한다. 예를 들어 n이 3이라면 위의 표처럼 1, 2, 3은 다음 자리가 비어있어서 그냥 넣는데 3 다음 자리엔
1이 들어가 있음을 확인할 수 있다. 그러니까 n값만큼 i를 집어넣으면 다음 자리는 들어가 있고 x값을(행을) 다음 값으로
변경해서 입력해야 한다.(x++; 이 부분)
line 18 : 다음 자리가 빈 경우를 검사한다.
line 19, 20 : x--, y--로 한 칸 왼쪽 한 칸 위쪽 자리로 옮긴다.
line 21~24 : 만약 맨 윗줄이나 맨 왼쪽 줄일 경우 마지막행, 열로 자리를 옮겨준다. (n-1, 3*3 행렬이면 프로그래밍에서는
0, 1, 2로 n-1이 마지막 행(또는 열)이다.)
line 27~31 : 마방진을 출력한다.
끝~~!.
'프로그래밍 > C programming' 카테고리의 다른 글
C언어 함수 기초 사용자 정의 함수, 함수정의, 리턴, 매개변수 (0) | 2020.08.14 |
---|---|
[C언어] 달팽이수열 프로그래밍 (2) | 2020.08.11 |
c언어 다중배열 [3][2] 제곱과 세제곱을 저장하고, 출력하는 프로그램 (0) | 2020.07.31 |
c언어 1에서 1000사이 정수중 수를 구성한 개개의 수가 연속적으로 되어있는 수를 찾는 프로그램(for문, if~else문, break) (0) | 2020.06.16 |
c언어 1~1000사이에 있는 수에 대해 암스트롱 수를 구하는 프로그램(각 자리 수에 세제곱의 합이 그 자신과 같아지는 수) (0) | 2020.06.16 |
댓글