첫 줄에 테스트 케이스의 수 T가 주어진다 (1 ≤ T ≤ 10).
각 테스트 케이스에 대해: 첫 줄에 배열의 크기를 나타내는 n (1 ≤ n < 500, n은 홀수) 그리고 각도 d가 주어진다. d는 0 ≤ |d| ≤ 360 을 만족하며 |d| 는 45의 배수이다. d가 양수이면 시계방향으로 d° 돌려야 하고, 음수이면 반시계방향으로 |d|° 돌려야 한다. 다음 n줄에 걸쳐 각 줄에 n개의 정수가 공백으로 구분되어 주어진다 (X의 원소들을 나타낸다). 각 값은 1 이상 1,000,000 이하의 정수이다.
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
- 배열의 행의 길이(높이)와 열의 길이(너비)를 이용한다.
초기에 y,x를 (0,0)으로 설정하고 가장 겉에 있는 테두리부터 돌린다. 이를 위해 높이 값과 너비 값을 이용한다. 시계 방향으로 테두리에 있는 값들을 큐에 담는다. 그리고 큐에 있는 원소들을 우측 방향으로 회전(또는 이동)시킨다.(python의 경우 deque에서 제공하는 rotate(-r)을 이용)
이후 큐에 있는 원소를 꺼내서 시계 방향으로 테두리의 값들을 넣는다. 완료가 되면 높이와 너비를 각각 2씩 차감하고 y,x를 각 1씩 더한다.
위의 과정을 높이 값이 0이 되거나 너비 값이 0이 될 때까지 시행한다.
import sys
from collections import deque
n, m, r = map(int, sys.stdin.readline().rstrip().split())
arr = [list(map(int,sys.stdin.readline().rstrip().split())) for _ in range(n)]
def rotate(y, x, height, width):
global arr
q = deque()
for i in range(x, x+width):
q.append(arr[y][i])
for i in range(y+1, y+height):
q.append(arr[i][x+width-1])
for i in range(x+width-2, x, -1):
q.append(arr[y+height-1][i])
for i in range(y+height-1, y, -1):
q.append(arr[i][x])
q.rotate(-r)
for i in range(x, x+width):
arr[y][i] = q.popleft()
for i in range(y+1, y+height):
arr[i][x+width-1] = q.popleft()
for i in range(x+width-2, x, -1):
arr[y+height-1][i] = q.popleft()
for i in range(y+height-1, y, -1):
arr[i][x] = q.popleft()
height = n
width = m
y, x = 0, 0
while True:
if height == 0 or width == 0: break
rotate(y, x, height, width)
y += 1
x += 1
height -= 2
width -= 2
for i in range(n):
for j in range(m):
print(arr[i][j], end = ' ')
print()