가장 먼저 구현하려고 했던 것은 바깥 쪽 테두리 배열을 돌리는 것이다.
이것은 상, 하, 좌, 우 방향을 나누어서 구현하였다.
현재 배열의 값을 다음 배열에 덮혀 씌워야 하므로 다음 배열의 값을 저장할 변수 tmp를 선언한다.
이것을 코드로 나타내보자
depth는 쉽게 말해 0은 가장 바깥 쪽 테두리, 1은 두번 째 바깥 쪽 테두리 순이다. 이것을 이용하면 테두리별로 시작과 종료 row, col을 알 수 있다. 테두리가 증가할수록 시작 row, col값은 1씩 증가하지만 반대로
종료 row, col값은 1씩 감소하게 된다.
tmp는 다음 인덱스 원소를 저장한다.
스왑하려면 임시 변수 temp가 있어야 한다. 이렇게 하여 이미지와 같은 로직이 된다.
import sys
from collections import deque
# t = int(sys.stdin.readline())
input = sys.stdin.readline
for test_case in range(1):
n, m, r = map(int, sys.stdin.readline().split())
arr = []
for _ in range(n):
arr.append(list(map(int, sys.stdin.readline().split())))
for depth in range(min(n,m) // 2):
rotate = (m-2*depth)*2 + (n-2*depth)*2 - 4
for _ in range(r % rotate):
start_row, end_row, start_col, end_col = depth, n - depth - 1, depth, m - depth - 1
tmp = arr[start_row][start_col]
## bottom
for row in range(start_row, end_row):
temp = arr[row + 1][start_col]
arr[row + 1][start_col] = tmp
tmp = temp
## right
for col in range(start_col,end_col):
temp = arr[end_row][col + 1]
arr[end_row][col + 1] = tmp
tmp = temp
## top
for row in range(end_row, start_row, -1):
temp = arr[row-1][end_col]
arr[row - 1][end_col] = tmp
tmp = temp
##left
for col in range(end_col, start_col, -1):
temp = arr[start_row][col - 1]
arr[start_row][col - 1] = tmp
tmp = temp
for tmp in arr:
print(' '.join(map(str, tmp)))
여기서 rotate부분을 입력받은 r을 그대로 쓸 필요가 없다. 왜냐하면 회전은 주기가 있기 때문이다.
4*4 배열을 기준으로 설명하자면 가장 바깥 쪽 배열은 12개 원소가 있다. 12개를 기준으로 주기를 가진다. 그래서 r % 주기값을 구하면 된다.
하지만 이렇게하면 python3는 시간초과가 발생한다. 반면에 pypy3는 통과한다.
다른 방법을 찾아보았다.
import sys
from collections import deque
# t = int(sys.stdin.readline())
input = sys.stdin.readline
for test_case in range(1):
n, m, r = map(int, sys.stdin.readline().split())
arr = []
for _ in range(n):
arr.append(list(map(int, sys.stdin.readline().split())))
s = 0
for depth in range(min(n,m) // 2):
q = deque()
start_row, end_row, start_col, end_col = depth, n - depth - 1, depth, m - depth - 1
for row in range(start_row, end_row):
q.append(arr[row][start_col])
for col in range(start_col, end_col):
q.append(arr[end_row][col])
for row in range(end_row,start_row,-1):
q.append(arr[row][end_col])
for col in range(end_col, start_col, -1):
q.append(arr[start_row][col])
cnt = (n - 2*depth)*2 + (m - 2*depth)*2 - 4
q.rotate(r % cnt)
for row in range(start_row, end_row):
arr[row][start_col] = q.popleft()
for col in range(start_col, end_col):
arr[end_row][col] = q.popleft()
for row in range(end_row,start_row,-1):
arr[row][end_col] = q.popleft()
for col in range(end_col, start_col, -1):
arr[start_row][col] = q.popleft()
for tmp in arr:
print(' '.join(map(str, tmp)))
deque의 메서드 중에서 rotate을 사용하면 회전을 시킬 수 있다.