크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5]
↓ ↑
A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
입력
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
출력
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
풀이 과정
돌리는 횟수 R의 제한이 크지 않다. 해당 과정을 그대로 구현하여 회전한 결과를 출력한다.
문제에서 표시된 것처럼, 가장자리 회전부터 시작해서 왼쪽 변, 오른쪽 변, 위쪽 변, 아래쪽 변을 한 번 회전 시키면 다음으로 회전할 외곽으로 한 칸씩 밀면서 반시계 회전을 진행했다. 그리고 이 한 번 회전하는 과정을 R번 반복했다.
import sys
input = sys.stdin.readline
n, m, r = map(int, input().rstrip().split())
arr = [list(map(int, input().rstrip().split())) for _ in range(n)]
row = [1, 0, -1, 0]
col = [0, 1, 0, -1]
for _ in range(r):
left = 0
right = m - 1
up = 0
down = n - 1
while left < right and up < down:
now = [left, up]
now_tmp = arr[left][up]
dir = 0
while True:
now[0] += row[dir]
now[1] += col[dir]
go = now_tmp
now_tmp = arr[now[0]][now[1]]
arr[now[0]][now[1]] = go
if (dir == 0 and now[0] == down) or (dir == 1 and now[1] == right) or (dir == 2 and now[0] == up) or (dir == 3 and now[1] == left):
dir = (dir + 1) % 4
if now[0] == left and now[1] == up: break
left += 1
right -= 1
up += 1
down -= 1
for i in range(n): print(' '.join(map(str, arr[i])))
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 23324 : 어려운 모든 정점 쌍 최단 거리 ( GOLD 4 ) / Python (1) | 2024.02.15 |
---|---|
[ BOJ ] 16927 : 배열 돌리기 2 ( GOLD 5 ) / Python (1) | 2024.02.15 |
[ BOJ ] 1946 : 신입 사원 ( SILVER 1 ) / Python (0) | 2024.02.15 |
[ BOJ ] 24523 : 내 뒤에 나와 다른 수 ( SILVER 2 ) / Python (0) | 2024.02.15 |
[ BOJ ] 16507 : 어두운 건 무서워 ( SILVER 1 ) / Python (1) | 2024.02.15 |