메뉴 건너뛰기

#include "pch.h"

#include <iostream>

 

using namespace std;

 

/*

원래 c언어 문제라 printf와 scanf를 사용해야 하지만, 귀찮아서 cin과 cout을 사용.

*/

int main()

{

    /*

    사용자로 부터 N X N 배열을 만들기 위해, N개를 입력 받아, 변수 n에 할당한다.

    arr이라는 변수명의 2차원 배열을 사용하기 위하여, 이중 포인터 변수로 arr을 선언한 후,

    malloc을 사용하여 N개의 방크기를 할당한다.

    그리고 arr 1차원 배열에 각각 malloc을 통해 N개의 방크기를 할당함으로써 N X N의 2차원 배열이 완성된다.

    포인터는 배열이라는 점을 생각하여 N X N의 동적 배열을 생성하는 것을 이해하도록 하자.

    */

    int n = 0;

    cout << "N X N 배열의 크기를 입력하시오:";

    cin >> n;

    int **arr = (int **) malloc(sizeof(int *) * n);

    for (int i = 0; i < n; i++)

        arr[i] = (int *)malloc(sizeof(int *) * n);

    

    /*

    x는 행, y는 열

    */

    int x = 0, y = 0;

    /*

    xInc는 x의 증감분, yInc는 y의 증감분

    각 증감분이 변화하다가 증가가 마지막 좌표에 가면, +/- 가 뒤바뀐다

    count는 배열에 들어갈 값이 1씩 늘어나는 변수

    isXDiff는 행이 바뀔지 열이 바뀔지를 결정

    xLen, yLen은 각 행열이 바뀔 길이 0이면 아무것도 남지 않으므로 종료

    xCount, yCount는 xLen, yLen의 길이만큼 변화하며, 값을 채우기 위함

    */

    int xInc = 1, yInc = 1;

    unsigned int count = 1;

    bool isXDiff = false;

    int yLen = n, xLen = n - 1;

    int xCount = xLen, yCount = yLen;

 

    do {

        /*

        배열 xy의 위치에 숫자를 넣고 다음에 넣을 숫자로 하나 증가시킨다.

        */

        arr[x][y] = count;

        count++;

        /*

        x가 바뀌는 동안 x에 xInc를 더해준다(좌로 이동의 경우 xInc는 -1이다)

        그러면서 xCount x좌표 변화해야 할 양을 줄여준다.

        xCount = 0이 되면 xInc의 +/-를 바꿔주고, 범위를 벗어났으므로 xInc를 되돌려준다.

        그리고 다음번에는 변화해야 할 x좌표의 양이 하나 감소하므로 xLen을 하나 줄인다.

        xLen만큼 xCount를 초기화해준다.

        y좌표를 변화시켜준 후 y좌표 변화를 위해 isXDiff값을 바꾼다.

        */

        if (isXDiff) {

            x += xInc;

            xCount--;

            if (xCount < 1) {

                xInc = xInc * -1;

                x += xInc;

                xLen--;

                xCount = xLen;

                y += yInc;

                isXDiff = !isXDiff;

            }

        }

        else {

            y = y + yInc;

            yCount--;

            if (yCount < 1) {

                yInc = yInc * -1;

                y += yInc;

                yLen--;

                yCount = yLen;                

                isXDiff = !isXDiff;

                x += xInc;

            }

        }

    } while (xLen != 0 || yLen != 0);

 

    /*

    배열에 입력된 값을 확인하기 위하여, 출력

    */

    for (int i = 0; i < n; i++) {

        for (int j = 0; j < n; j++) {

            cout << (arr[i][j] < 10 ? " " : "") << arr[i][j] << " ";

        }

        cout << endl;

    }

}

 

결과

 

N X N 배열의 크기를 입력하시오:4

 1  2   3   4

12 13 14  5

11 16 15  6

10  9   8  7

 

변수의 흐름을 따라가 보면 쉽게 이해할 수 있고, 포인터 어려우면 외우자.