본문으로 바로가기

C언어 - 마방진

category Programming/C 언어 2017. 9. 7. 10:53


C언어를 공부하다 보면 홀수 마방진에 대해 배운다.




마방진이란 무엇인가?


- 1부터 n*n까지의 연속된 자연수를 가로, 세로, 대각선의 합이 같아지도록 정사각형 모양으로 배열한 것이다.



C언어에서 이 마방진을 하는 것은 지나가는 과정에 불과하지만, 분명 알고리즘의 공부가 될 수 있다.


본 글에서는 홀수 마방진에 대해서 다루고자 한다.



마방진은 만드는 규칙은 다음과 같다.


1. 주어진 배열의 맨 윗줄의 가운데 칸에서 시작.


2. 현재 위치에서 우상(대각선 오른쪽 위) 방향으로 진행하며 1씩 증가하는 값을 넣는다.


3. 첫줄 다음은 마지막줄이며(행), 마지막줄 다음은 첫줄이다.(열) //행은 우리가 글을 읽을떄의 ~번째 줄과 같이 가로줄이라고 생각하면 외우기 쉽다.


4. 진행하는 방향에 값이 이미 있을 경우에는 그 방향이 아닌 마지막으로 넣은 칸의 한칸 아래로 진행한다.


예)


3 * 3 마방진


 8 1 6

 3 5 7

 4 9 2


5 * 5 마방진


 17 24  1  8 15

 23  5  7 14 16

  4  6 13 20 22

 10 12 19 21  3

 11 18 25  2  9


이 마방진을 만드는데에 필요한 C언어 지식은 for문과 if문이면 충분하다.


인터넷을 둘러보니 마방진을 만드는 데 함수를 과하게 이용하는 방법들이 많기에 간단한 방법을 소개한다.


코드는 다음과 같다.


#include<stdio.h>

int main() {
    int i, x, y, n;
    int a[30][30] = { 0, };
    printf("Enter : ");
    scanf("%d", &n);
    x = 1, y = (n + 1) / 2;

    for (i = 1; i <= n*n; i += 1) {
        a[x][y] = i;

        if (i%n == 0) {
            x++;
        }
        else {
            x--;
            y++;
            if (x == 0) {
                x = n;
            }
            if (y == n + 1) {
                y = 1;
            }
        }
    }

    for (i = 1; i <= n; i += 1) {
        for (int j = 1; j <= n; j += 1) {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}


핵심은 i%n==0 인 부분이다.


'이미 칸에 값이 들어있는 경우'를 이렇게 표현할 수 있다는 점이 중요하다.



많은 지식이 없더라도 분명 풀 수 있는 문제이다.


고등학교 지식으로 중학교 문제를 푼다면 정말 쉽게 풀겠지만, 중학교 지식으로 중학교 문제를 풀기 위해서는 머리를 꽤 써야 할 것이다.


같은 논리로, 지식을 적게 사용하면 그것을 처리하는 머리가 일해야 한다.


물론 코드는 짧고 단순할수록 실행 시간이 단축되고 받아들이는 컴퓨터가 편해진다.


실행시간 등 아직은 신경쓰지 않아도 될 부분이지만, 컴퓨터 과학을 전공하는 사람이라면 조금은 미리 알아두어도 괜찮을 것이라 생각한다.



맨 위로