- 1학기때 삼성sds 코테 미궁탈출 문제에서 배열 돌리는 유형이 나왔었는데, 당시에는 for문 엄청 돌면서 삽질했음/ 16926 문제에선 학습을 위해 최적화된 코드를 참조함
- 배열이 회전을 할 때는 껍질별로 회전을 함
-> 때문에 껍질의 개수 (min(N, M) // 2) 만큼 for문을 돌며 바깥쪽 껍질부터 안쪽 껍질까지 작업을 진행함
-> 하나의 껍질을 queue에 담아주고, deque의 rotate 메소드를 이용해 R만큼 회전시키고 이를 answer 2차원 리스트에 담아줌 (queue.rotate(R)은 시계방향으로 R만큼 회전, queue.rotate(-R)은 반시계방향으로 R만큼 회전)
- 인덱스 맞추는 부분이 좀 머리가 아픈데, 껍질의 위쪽, 오른쪽, 아래쪽, 왼쪽은 아래와 같음
import sys
from collections import deque
N, M, R = map(int, sys.stdin.readline()[:-1].split())
arr = []
for n in range(N):
arr.append(list(sys.stdin.readline()[:-1].split()))
answer = [[0] * M for n in range(N)]
for i in range(min(N, M) // 2):
queue = deque([])
queue.extend(arr[i][i:M - i])
queue.extend([row[M - i - 1] for row in arr[i + 1: N - i - 1]])
queue.extend(arr[N - i - 1][i:M - i][::-1])
queue.extend([row[i] for row in arr[i + 1:N - i - 1]][::-1])
queue.rotate(-R)
for j in range(i, M - i):
answer[i][j] = queue.popleft()
for j in range(i + 1, N - i - 1):
answer[j][M - i - 1] = queue.popleft()
for j in range(M - i - 1, i - 1, -1):
answer[N - i - 1][j] = queue.popleft()
for j in range(N - i - 2, i, -1):
answer[j][i] = queue.popleft()
for i in range(len(answer)):
print(" ".join(answer[i]))