문제
크기가 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번 회전시킨 결과를 출력한다.
제한
- 2 ≤ N, M ≤ 300
- 1 ≤ R ≤ 1,000
- min(N, M) mod 2 = 0
- 1 ≤ Aij ≤ 108
예제 입력 1
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
예제 출력 1
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
예제 입력 2
5 4 7
1 2 3 4
7 8 9 10
13 14 15 16
19 20 21 22
25 26 27 28
예제 출력 2
28 27 26 25
22 9 15 19
16 8 21 13
10 14 20 7
4 3 2 1
예제 입력 3
2 2 3
1 1
1 1
예제 출력 3
1 1
1 1
정답
deque의 rotate 기능을 사용하여 풀었다.
import sys
input = sys.stdin.readline
from collections import deque
y, x, n = map(int,input().split())
deq = deque()
array = []
answer = [[0]*x for _ in range(y)]
for i in range(y):
array.append(list(input().split()))
loops = min(y,x)//2
for i in range(loops):
deq.clear()
deq.extend(array[i][i:x-i])
deq.extend([row[x-i-1] for row in array[i+1:y-i-1]])
deq.extend(array[y-i-1][i:x-i][::-1])
deq.extend([row[i] for row in array[i+1:y-i-1][::-1]])
deq.rotate(-n)
for j in range(i, x-i): # 위쪽
answer[i][j] = deq.popleft()
for j in range(i+1, y-i-1): # 오른쪽
answer[j][x-i-1] = deq.popleft()
for j in range(x-i-1, i-1, -1): # 아래쪽
answer[y-i-1][j] = deq.popleft()
for j in range(y-i-2, i, -1): # 왼쪽
answer[j][i] = deq.popleft()
for line in answer:
print(" ".join(line))
'코딩딩 > BOJ' 카테고리의 다른 글
[백준 7568번] 문제풀이 (0) | 2023.05.28 |
---|---|
[백준 15686] 문제풀이 (1) | 2023.05.28 |
[백준 17478번] 문제풀이 (0) | 2023.05.25 |
[백준 24444번] 문제풀이 (1) | 2023.05.24 |
[백준 24479] 문제풀이 (0) | 2023.05.23 |