첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
- queue를 사용해서 1차원적으로 접근해 돌릴 수 있는 만큼 다 돌리고 원본배열에 반영
- N*M 배열을 반시계로 R번 돌림
- 큐에 담아놓고 큐에서 돌린 값을 넣는다
- 큐에서 값을 빼 저장한다
from collections import deque
N, M, R = map(int, input().split()) # N*M 배열을 반시계로 R번 돌림
arr = [list(map(int, input().split())) for _ in range(N)]
move = [[1, 0], [0, 1], [-1, 0], [0, -1]]
def rotate():
q = deque()
for depth in range(min(N, M) // 2):
r = c = depth
for dr, dc in move: # 큐에 담아놓고
while True:
nr = r + dr
nc = c + dc
if depth <= nr < N - depth and depth <= nc < M - depth:
q.append(arr[r][c])
r = nr
c = nc
else:
break
# 돌린다
for _ in range(R % ((N - depth * 2) * 2 + (M - depth * 2) * 2 - 4)):
q.appendleft(q.pop())
for dr, dc in move: #큐에서 돌린 값을 넣는다
while True:
nr = r + dr
nc = c + dc
if depth <= nr < N - depth and depth <= nc < M - depth:
arr[r][c]=q.popleft()
r = nr
c = nc
else:
break
# 큐에서 값을 빼 저장한다
rotate()
for i in range(N):
for j in range(M):
print(arr[i][j], end=" ")
print()