Post

[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.