본문 바로가기

DEVELOP/Algorithm

[C] SW Expert Academy 문제풀이 :: 1961번

반응형


SW Expert Academy 1961번 숫자 배열 회전 문제풀이. 문제가 말하는 게 무슨 말인지 이해하는데 한참 걸렸다. 2차원 배열을 90도, 180도, 270도 회전해 출력하는 문제인데, 1자리 수가 들어있는 3x3 행렬을 회전했더니 3자리 수가 들어있는 3x3 행렬이 나온 것이다. 알고보니 90, 180, 270도 회전한 배열을 나란히 출력한 것이었다. 어쨌든 구현은 간단했다.



문제


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-OKAVYDFAUq&categoryId=AV5Pq-OKAVYDFAUq&categoryType=CODE



 N x N 행렬이 주어질 때,


시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.



풀이


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
75
#include <stdio.h>
#include <malloc.h>
 
int main() {
    int tc;
    scanf("%d"&tc);
 
    for (int t = 0; t < tc; t++) {
        int n;
        scanf("%d"&n);
 
        // 배열 할당 및 값 입력
        int** arr;
        arr = (int**)malloc(sizeof(int*)*n);
        for (int i = 0; i < n; i++) {
            arr[i] = (int*)malloc(sizeof(int)*n);
            for (int j = 0; j < n; j++) {
                scanf("%d"&arr[i][j]);
            }
        }
 
        // 90도 회전 배열
        int **arr90;
        arr90 = (int**)malloc(sizeof(int*)*n);
        for (int i = 0; i < n; i++) {
            arr90[i] = (int*)malloc(sizeof(int)*n);
            for (int j = 0; j < n; j++) {
                arr90[i][j] = arr[n - 1 - j][i];
            }
        }
 
        // 180도 회전 배열
        int **arr180;
        arr180 = (int**)malloc(sizeof(int*)*n);
        for (int i = 0; i < n; i++) {
            arr180[i] = (int*)malloc(sizeof(int)*n);
            for (int j = 0; j < n; j++) {
                arr180[i][j] = arr[n - 1 - i][n - 1 - j];
            }
        }
 
        // 360도 회전 배열
        int **arr360;
        arr360 = (int**)malloc(sizeof(int*)*n);
        for (int i = 0; i < n; i++) {
            arr360[i] = (int*)malloc(sizeof(int)*n);
            for (int j = 0; j < n; j++) {
                arr360[i][j] = arr[j][n - 1 - i];
            }
        }
 
        printf("#%d\n", t + 1);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                printf("%d", arr90[i][j]);
            }
            printf(" ");
            for (int j = 0; j < n; j++) {
                printf("%d", arr180[i][j]);
            }
            printf(" ");
            for (int j = 0; j < n; j++) {
                printf("%d", arr360[i][j]);
            }
            printf("\n");
        }
 
        free(arr);
        free(arr90);
        free(arr180);
        free(arr360);
    }
 
    return 0;
}
cs


코드가 좀 길다. 함수화할까 했다가 그냥 큰 의미 없는 것 같아서.


먼저 배열의 크기인 n을 입력받는다.


그리고 동적할당으로 n*n 크기의 2차원 배열을 만들어주고 값을 입력받는다. 그럼 준비 끝. 이제 각각 90도, 180도, 270도 행렬을 만들어주면 된다. 코드에는 270을 360이라고 써놨는데 270이라고 생각하면 된다.


동적할당으로 arr90이라는 2차원 배열을 만들어준다. 그리고 arr90[i][j]에 arr의 적당한 위치에 있는 값을 넣어주면 된다. 일단 i는 행을 의미하고 j는 열을 의미한다. 이 방식이면 점점 늘어나는 각 i에 대해서 j가 늘어나는 식으로 각 위치를 참조한다. 그러니깐 3x3이면 00 01 02 10 11 12 20 21 22순으로 arr90에 접근하는 것이다. 다시 정리하면 i는 0->2로, j는 0->2로 증가한다.


그런데 90도 돌린 배열의 숫자를, 즉 arr90[i][j]에 들어갈 숫자를 저 순서대로 살펴보면 원래 arr 배열의 20 10 00 21 11 01 22 12 02 순으로 들어가있다. 즉 i는 2->0으로, j는 0->2로 들어가는 것이다. 그래서 arr[n-1-j][i]를 넣어준다. 이러면 i=0일 때 j는 3-1-0, 3-1-1, 3-1-2순으로 줄어든다.


같은 방식으로 180도와 270도의 규칙을 찾아준다. 새로운 배열에 i=0->2, j=0->2 방향으로 값을 넣어준다고 할 때, 원래 있던 행렬의 어떤 인덱스부터 어떻게 접근할지만 생각해보면 된다.


그렇게 90, 180, 270도 행렬을 만들어줬으면 각각의 행을 순서대로 한 번에 출력해주면 된다.

반응형