Search
Duplicate
🍇

배열 돌리기 1

주차
14
문제번호
16926
언어
Python
티어
실버
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

문제

풀이

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
복사