17276 : 배열 돌리기

CS·2026년 2월 19일

SSPS

목록 보기
9/10

formula

시계 45도만 구현해놓고 반복해서 사용
반시계 45도의 경우 315도를 돈 것과 같은 효과
음수처리를 위해 다음 수식 사용

D = (D + 360) % 360;

혹은

if(D<0) D += 360

이후

int cnt = D / 45;
for (int c = 0; c < cnt; c++) {
	rotate45();
}

45도로 나눠서 돌아갈 횟수만큼 회전

Implementation

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

#define MAX 550
int T, N, D;
int matrix[MAX][MAX];
int temp[MAX][MAX];

void copyMap(int copy[MAX][MAX], int origin[MAX][MAX]) {
    for (int r = 1; r <= N; r++) {
        for (int c = 1; c <= N; c++) {
            copy[r][c] = origin[r][c];
        }
    }
}

void rotate45() {
    copyMap(temp, matrix);

    int arr[MAX] = { 0 };
    int half = (N + 1) / 2; //중점 좌표

    // 가운데 행
    for (int c = 1; c <= N; c++) {
        arr[c] = temp[half][c];
    }
    for (int i = 1; i <= N; i++) {
        matrix[i][i] = arr[i];
    }

    // 대각선1
    for (int i = 1; i <= N; i++) {
        arr[i] = temp[i][i];
    }
    for (int i = 1; i <= N; i++) {
        matrix[i][half] = arr[i];
    }

    // 수직선
    for (int i = 1; i <= N; i++) {
        arr[i] = temp[i][half];
    }
    for (int i = 1; i <= N; i++) {
        matrix[i][N - i + 1] = arr[i]; // 좌표 조정
    }

    // 대각선2
    for (int i = 1; i <= N; i++) {
        arr[i] = temp[N - i + 1][i];
    }
    for (int c = 1; c <= N; c++) {
        matrix[half][c] = arr[c];
    }

}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> T;


    for (int i = 0; i < T; i++) {
        cin >> N >> D;
        D = (D + 360) % 360;

        for (int r = 1; r <= N; r++) {
            for (int c = 1; c <= N; c++) {
                cin >> matrix[r][c];
            }
        }
        

        int cnt = D / 45;
        for (int c = 0; c < cnt; c++) {
            rotate45();
        }

        for (int r = 1; r <= N; r++) {
            for (int c = 1; c <= N; c++) {
                cout << matrix[r][c] << " ";
            }
            cout << "\n";
        }
    }

}
profile
학습

0개의 댓글