16926번: 배열 돌리기 1
크기가 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]
www.acmicpc.net
문제
크기가 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번 회전시킨 결과를 출력한다.
코드
import sys
input = sys.stdin.readline
def rotate(n, m, arr):
for i in range(min(n, m) // 2):
row = n - i*2 # 세로 길이
col = m - i*2 # 가로 길이
top = []
bottom = []
for j in range(i, i+col):
top.append(arr[i][j])
bottom.append(arr[n-1-i][j])
left = []
right = []
for j in range(i, i+row):
left.append(arr[j][i])
right.append(arr[j][m-1-i])
# 시작은 i, 끝은 n-1-i / m-1-i
# 윗줄
for j in range(1, col):
arr[i][i+j-1] = top[j]
# 아랫줄
for j in range(1, col):
arr[n-1-i][i+j] = bottom[j-1]
# 왼쪽
for j in range(1, row):
arr[i+j][i] = left[j-1]
# 오른쪽
for j in range(1, row):
arr[i+j-1][m-1-i] = right[j]
n, m, r = map(int, input().split())
arr = []
for _ in range(n):
arr.append(list(map(int, input().split())))
# r번 회전
for _ in range(r):
rotate(n, m, arr)
for i in range(n):
print(*arr[i])
Python3로는 시간 초과나서 통과가 되지 않고 PyPy3로만 통과가 된다.
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 17406번 배열 돌리기 4 (0) | 2023.02.27 |
---|---|
[Python/파이썬] 백준 16918번 봄버맨 (0) | 2023.02.25 |
[Python/파이썬] 백준 15787번 기차가 어둠을 헤치고 은하수를 (0) | 2023.02.23 |
[Python/파이썬] 백준 17276번 배열 돌리기 (0) | 2023.02.23 |
[Python/파이썬] 백준 21611번 마법사 상어와 블리자드 (0) | 2023.02.23 |