카테고리 없음

[백준][Python] 16927 배열돌리기2

findTheValue 2021. 10. 1. 08:09

배열돌리기 1에서 달라진것은 각 cycle마다 회전 횟수의 압축이 필요하다는 점.

cycle크기는 하나 안으로 들어갈때마다 8칸씩 줄어들기때문에 각 사이즈로 나눈 나머지값만큼만 회전시켜준다.

 

import sys
input = sys.stdin.readline

def rotate(start):

    #init_tmp
    top = matrix[start][start]
    left = matrix[N-start-1][start]
    bottom = matrix[N-start-1][M-start-1]
    right = matrix[start][M-start-1]

    # top
    for i in range(start+1,M-start):
        matrix[start][i-1] = matrix[start][i]
    # left
    for i in range(N-start-1,start,-1):
        matrix[i][start] = matrix[i-1][start]
    # bottom
    for i in range(M-start-1,start+1,-1):
        matrix[N-start-1][i] = matrix[N-start-1][i-1]
    # right
    for i in range(start+1,N-start):
        matrix[i-1][M-start-1] = matrix[i][M-start-1]
    # finish
    matrix[start+1][start] = top
    matrix[N-start-1][start+1] = left
    matrix[N-start-2][M-start-1] = bottom
    matrix[start][M-start-2] = right

N, M, R = map(int,input().split())
size = 2 * N + 2 * M - 4
matrix = [list(map(int, input().split())) for _ in range(N)]
short = N if N <= M else M

for n_th in range(short//2):
    for _ in range(R%(size-8*n_th)):
        rotate(n_th)

for row in matrix:
    print(*row)