2차원 배열 좌우 회전

학교 도서관에서 열혈 C를 잠깐 빌렸었는데
재미있어 보이는 예시가 있길래
2차원 배열과 포인터 부분만 주구장창 찾아보다가
어떻게든 맹글긴 했네요 ㅎㅎ

좌/우로 돌리는 함수 각각 1개씩 만들었는데
함수 1개로 통합해보고는 싶지만
더 이상 곶통받기에는 좀 무리라…

#include <stdio.h>
#define SIZE_1d 4  // size of 2d array's 1st dimension (height)
#define SIZE_2d 4  // size of 2d array's 2nd dimension (width)

void print2Darr(int (*farr)[SIZE_2d], int len_1d);
void turn2Darr_right(int (*farr)[SIZE_2d], int len_1d);
void turn2Darr_left(int (*farr)[SIZE_2d], int len_1d);

int main()
{
    int board[SIZE_1d][SIZE_2d] = {
         1,  2,  3,  4,
         5,  6,  7,  8,
         9, 10, 11, 12,
        13, 14, 15, 16
    };

    printf("Before:\n");
    print2Darr(board, SIZE_1d);
    
    turn2Darr_right(board, SIZE_1d);

    printf("\nAfter:\n");
    print2Darr(board, SIZE_1d);

    turn2Darr_left(board, SIZE_1d);

    printf("\nAfter2:\n");
    print2Darr(board, SIZE_1d);

    return 0;
}

void print2Darr(int (*farr)[SIZE_2d], int len_1d)
{
    int m, n;

    for (m=0; m!=len_1d; m++)
    {
        for (n=0; n!=SIZE_2d; n++)
        {
            printf("%02d ", farr[m][n]);
        }
        printf("\n");
    }
}

void turn2Darr_right(int (*farr)[SIZE_2d], int len_1d)
{
    int m, n;
    int sample[SIZE_1d][SIZE_2d] = {
        0, 0, 0, 0,
        0, 0, 0, 0,
        0, 0, 0, 0,
        0, 0, 0, 0
    };

    // printf("Is error occur in here?\n");

    for (m=0; m<len_1d; m++)
    {
        for (n=SIZE_2d-1; n>=0; n--)
        {
            // printf("m: %d, n: %d\n", m, n);
            sample[m][3-n] = farr[n][m];
        }
    }

    // printf("\nIn function:\n");
    // print2Darr(sample, SIZE_1d);

    for (m=0; m<len_1d; m++)
    {
        for (n=0; n<SIZE_2d; n++)
            farr[m][n] = sample[m][n];
    }
}

void turn2Darr_left(int (*farr)[SIZE_2d], int len_1d)
{
    int m, n;
    int sample[SIZE_1d][SIZE_2d] = {
        0, 0, 0, 0,
        0, 0, 0, 0,
        0, 0, 0, 0,
        0, 0, 0, 0
    };

    // printf("Is error occur in here?\n");

    for (m=len_1d-1; m>=0; m--)
    {
        for (n=0; n<SIZE_2d; n++)
        {
            // printf("m: %d, n: %d\n", m, n);
            sample[3-m][n] = farr[n][m];
        }
    }

    // printf("\nIn function:\n");
    // print2Darr(sample, SIZE_1d);

    for (m=0; m<len_1d; m++)
    {
        for (n=0; n<SIZE_2d; n++)
            farr[m][n] = sample[m][n];
    }
}

> Executing task: C:\Users\user\Desktop\Programming\C\sample1.exe  <

Before:     
01 02 03 04 
05 06 07 08 
09 10 11 12 
13 14 15 16 

After:      
13 09 05 01 
14 10 06 02 
15 11 07 03 
16 12 08 04 

After2:     
01 02 03 04
05 06 07 08
09 10 11 12 
13 14 15 16

Terminal will be reused by tasks, press any key to close it.

항상 느끼는거지만
꼭 시험기간때만 프로그래밍이 진짜 재밌네요 ㅋㅋ
중간고사 25일 남았는데…


그나마 중학교와는 다르게
방과후랑 동아리 시간이 있어서 견딜만하네요
…기왕 이렇게 된거 명반이나 듣고가세요

셤끝나고 이틀 드리겠읍니다

1 Like

않되요 젭알ㅠㅠ
셤끝나고 일주일만 유일하게 겜할수 있는데…

빨리 끝낼수록, 더 많이 겜할수 있겠군요. 부럽읍니다.

1 Like

저도 한 번 해봤읍니다

C
#include <stdio.h>
#include <stdlib.h>

void* turn(int count, size_t N, const int src[static N][N], int dest[static N][N]) {
    count %= 4;
    for (size_t i = 0; i < N; ++i) {
        for (size_t j = 0; j < N; ++j) {
            switch (count) {
            case 1:  dest[    j    ][N - i - 1] = src[i][j]; break; //  90˚
            case 2:  dest[N - i - 1][N - j - 1] = src[i][j]; break; // 180˚
            case 3:  dest[N - j - 1][    i    ] = src[i][j]; break; // 270˚
            default: dest[    i    ][    j    ] = src[i][j]; break; // 360˚
            }
        }
    }

    return dest;
}

void array_print(size_t N, const int arr[static N][N]) {
    for (size_t i = 0; i < N; ++i) {
        for (size_t j = 0; j < N; ++j) {
            printf("%d ", arr[i][j]);
        }
        puts("");
    }
}

int main(int argc, char* argv[argc + 1]) {
    int A[3][3] = { 1, 2, 3, 
                    4, 5, 6, 
                    7, 8, 9 };
    int B[3][3] = { 0 };

    const size_t size = 3;

    for (int i = 0; i < 5; ++i) {
        array_print(size, turn(i, size, A, B)); 
        puts("");
    }

    return EXIT_SUCCESS;
}
1 Like

조금 생소한 표현에 대해 질문이 있습니다…

int dest[static N][N]

본문에서 매개변수를 저렇게 표현했는데

int dest[][N]
int (*dest)[N]

이렇게 표현하는 것과 성능, 기능적으로 차이가 있나요?
아니면 코드를 읽기 쉽게 해주는 표현인 건가요?

1 Like

늅늅이 마저 지나갑니다

1 Like

나만 죽을수는 없ㅈㅣ

여담으로 파이썬에서 행렬 회전하기 pqoPYS - Online Python3 Interpreter & Debugging Tool - Ideone.com

1 Like