16927번: 배열 돌리기 2
크기가 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인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
입력
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
출력
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
코드
from collections import deque
n, m, r = map(int, input().split())
arr = []
for _ in range(n):
arr.append(list(map(int, input().split())))
for cnt in range(min(n, m)//2):
top_r, top_c = cnt, cnt # 왼위
bottom_r, bottom_c = n-1-cnt, m-1-cnt # 오른아래
q = deque([])
# 왼줄
for i in range(top_r, bottom_r):
q.append(arr[i][top_c])
# 아랫줄
for i in range(top_c, bottom_c):
q.append(arr[bottom_r][i])
# 오른줄
for i in range(bottom_r, top_r, -1):
q.append(arr[i][bottom_c])
# 윗줄
for i in range(bottom_c, top_c, -1):
q.append(arr[top_r][i])
q.rotate(r)
# 왼줄
for i in range(top_r, bottom_r):
arr[i][top_c] = q.popleft()
# 아랫줄
for i in range(top_c, bottom_c):
arr[bottom_r][i] = q.popleft()
# 오른줄
for i in range(bottom_r, top_r, -1):
arr[i][bottom_c] = q.popleft()
# 윗줄
for i in range(bottom_c, top_c, -1):
arr[top_r][i] = q.popleft()
for r in arr:
print(*r)
위 그림의 순서대로 deque에 넣고 회전 수(r)만큼 rotate로 돌려서 다시 new_arr에 저장해준다.
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 17144번 미세먼지 안녕! (0) | 2023.03.03 |
---|---|
[Python/파이썬] 백준 21610번 마법사 상어와 비바라기 (0) | 2023.03.02 |
[Python/파이썬] 백준 17406번 배열 돌리기 4 (0) | 2023.02.27 |
[Python/파이썬] 백준 16918번 봄버맨 (0) | 2023.02.25 |
[Python/파이썬] 백준 16926번 배열 돌리기 1 (0) | 2023.02.24 |