ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (추가) 달팽이 배열
    예제/Layer7_20160323 2017. 3. 28. 01:47
    반응형

    2016 03 23 다차원 배열에서 마지막 문제인 달팽이 배열을 1년뒤에 다시 짜 보았습니다.

    최대한 이해가 쉽게 주석을 많이 달아놨습니다. 혹시라도 이해가 안되시면 댓글을 남겨주세요

    기본 메커니즘은 가로와 세로를 나누고, 각각 오른쪽,왼쪽/아래쪽,위쪽 으로 진행방향을 기준으로 나누었습니다.


    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include <stdio.h>
    int main(){
        int arr[100][100]={0,};
        //값을 저장할 배열
        int input;
        //입력값
        int i, j;
        //for문 돌리려고
        int garo_num, sero_num;
        //garo_num : 가로로 진행할 때 찍어야할 번호의 개수
        int present_garo=-1, present_sero=0;
        //present_garo : 현재 가로. 세로로 진행하고 있을 때 고정되어야 할 값
            //왜 present_garo만 -1로 초기화 했을까?
            //=>처음엔 무조건 가로로 오른쪽으로 진행하기 때문에 ++present_garo를 만날수밖에 없다.
            //=>첫 배열값을 채울때 arr[0][0]으로 채워야 하기 때문에
            //=>present_sero는 0으로, present_garo는 -1로 초기화 한 것이다.
        //present_sero : 현재 세로. 가로로 진행하고 있을 때 고정되어야 할 값
        int number=1;
        //현재 찍어야 할 수
     
     
        scanf("%d"&input);//입력받기
     
        garo_num=input;//맨 처음 시작 : input만큼 가로로 진행
        sero_num=input-1;//맨 처음 시작 : input-1만큼 세로로 진행
     
        for(i=0; i<input*2-1++i){
            /*
            input 이 5라고 가정했을 때
            5, 4, 4, 3, 3, 2, 2, 1, 1 => 9번 반복.
            */
            if(i%2==0){//가로로 진행할 차례!
                if(garo_num%2==input%2){//가로에서 오른쪽으로 갈지, 왼쪽으로 갈지 결정! : 여기선 오른쪽!
                    for(j=0; j<garo_num; ++j){
                        //가로로 진행할 때는 세로값이 고정되어 있어야겠죠? : present_sero 고정!
                        arr[present_sero][++present_garo]=number++;
                        //값을 넣고 number의 값을 1씩 늘려주고 현재의 가로에 +1.
                    }
                    --garo_num;//다음에 가로를 채울 땐 하나 적은 개수로 채웁니다.
                }
                else{//여기선 왼쪽!
                    for(j=0; j<garo_num; ++j){
                        arr[present_sero][--present_garo]=number++;
                    }
                    --garo_num;
                }
            }
            else{//세로로 진행할 차례!
                if(sero_num%2==(input-1)%2){//세로에서 아래쪽으로 갈지, 위쪽으로 갈지 결정 : 여기선 아래쪽
                    for(j=0; j<sero_num; ++j){
                        //세로로 진행할 때는 세로값이 고정되어 있어야겠죠? : present_garo 고정!
                        arr[++present_sero][present_garo]=number++;
                        //값을 넣고 number의 값을 1씩 늘려주고 현재의 세로에 +1.
                    }
     
                    --sero_num;//다 채웠으면 마찬가지로 1씩 줄여줍시다.
                }
                else{//위쪽으로 갑시당
                    for(j=0; j<sero_num; ++j){
                        arr[--present_sero][present_garo]=number++;
                    }
                    --sero_num;
                }
            }
        }
     
     
        for(i=0; i<input; ++i){
            for(j=0; j<input; ++j){
                printf("%5d", arr[i][j]);//가독성의 편의를 위해 %5d를 택했습니다.
            }
            printf("\n");
        }
    }
    cs


    반응형

    댓글

Designed by Tistory.