[BOJ] 배열 돌리기 1 - 16926 (G5)
[BOJ] 배열 돌리기 1 - 16926 (G5)
| 시간 제한 | 메모리 제한 |
|---|---|
| 1 초 | 512 MB |
문제
크기가 N×M인 배열이 있을 때, 배열을 반시계 방향으로 R번 회전시키려고 한다. 배열의 회전은 각 껍질 별로 독립적으로 일어난다.
풀이
구현 문제이다. 각 껍질을 추출하고 회전시킨 후 다시 배치한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def rotate_matrix(n, m, r, matrix):
layers = min(n, m) // 2
for layer in range(layers):
elements = []
# top row (left to right)
elements += matrix[layer][layer:m-layer]
# right column (top to bottom, excluding first and last)
elements += [matrix[i][m-layer-1] for i in range(layer+1, n-layer-1)]
# bottom row (right to left)
elements += matrix[n-layer-1][layer:m-layer][::-1]
# left column (bottom to top, excluding first and last)
elements += [matrix[i][layer] for i in range(n-layer-2, layer, -1)]
# Rotate the elements
rot = r % len(elements)
rotated = elements[rot:] + elements[:rot]
idx = 0
# Place back the rotated elements using slicing
# top row
top_len = m - 2*layer
matrix[layer][layer:m-layer] = rotated[idx:idx+top_len]
idx += top_len
# right column
right_len = n - 2*layer - 2 + 1
for i in range(layer+1, n-layer-1):
matrix[i][m-layer-1] = rotated[idx]
idx += 1
# bottom row
bottom_len = m - 2*layer
matrix[n-layer-1][layer:m-layer] = rotated[idx:idx+bottom_len][::-1]
idx += bottom_len
# left column
for i in range(n-layer-2, layer, -1):
matrix[i][layer] = rotated[idx]
idx += 1
if __name__ == '__main__':
N, M, R = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
rotate_matrix(N, M, R, matrix)
for row in matrix:
print(*row)
시간 복잡도
O(N × M)
This post is licensed under CC BY 4.0 by the author.