문제
풀이
•
i 번째에 해당하는 x, y 좌표를 구한다.
•
n = 4, m = 4 라고 가정할떄, x y 좌표를 구하는 공식은
◦
반만 구하고 나머지 반은 +2 해주면 된다.
◦
반의 크기 size = n + m - 2 = 6 이다.
◦
반으로 나눴을때 index를 구하고 m - 2 보다 크면 1, 아니면 0
◦
(i % 6) > (m - 2)
◦
+2 해주기
◦
((i % 6) > (m - 2)) + 2 * (i / 6)
•
tmp 배열에 넣어놓고 i + r 부터 다시 붙여넣는다.
•
이때 배열 크기를 넘어가니까 (i + r) % size 해준다.
•
결과를 저장할 배열을 만들고 r 만큼 이동시켜서 값을 넣어도 된다. 근데 더 느림
구현
N, M, r = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
def get_index(i, n, m):
return ((i % (n + m - 2)) > (m - 2)) + 2 * int(i / (n + m - 2))
def rotate(y, x, n, m):
if (n < 2 or m < 2):
return
tmp = []
size = (n + m - 2) * 2
_x, _y = x, y
for i in range(size):
tmp.append(arr[_y][_x])
_y += dy[get_index(i, n, m)]
_x += dx[get_index(i, n, m)]
_x, _y = x, y
for i in range(size):
arr[_y][_x] = tmp[(i + r) % size]
_y += dy[get_index(i, n, m)]
_x += dx[get_index(i, n, m)]
rotate(y + 1, x + 1, n - 2, m - 2)
rotate(0, 0, N, M)
for i in arr:
for j in i:
print(j, end=" ")
print()
Python
복사
N, M, r = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
result = [[0 for _ in range(M)] for _ in range(N)]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
rdx = [0, 1, 0, -1]
rdy = [1, 0, -1, 0]
def get_index(i, n, m):
return ((i % (n + m - 2)) > (m - 2)) + 2 * int(i / (n + m - 2))
def get_index_r(i, n, m):
return ((i % (n + m - 2)) > (n - 2)) + 2 * int(i / (n + m - 2))
def rotate(y, x, n, m):
if (n < 2 or m < 2):
return
size = (n + m - 2) * 2
_x, _y = x, y
for i in range(size):
_rx, _ry = _x, _y
for _r in range(r % size):
j = (size - (i - _r)) % size
_ry += rdy[get_index_r(j, n, m)]
_rx += rdx[get_index_r(j, n, m)]
result[_ry][_rx] = arr[_y][_x]
_y += dy[get_index(i, n, m)]
_x += dx[get_index(i, n, m)]
rotate(y + 1, x + 1, n - 2, m - 2)
rotate(0, 0, N, M)
for i in result:
for j in i:
print(j, end=" ")
print()
Python
복사