Skip to content
CatBus
Go back

[BOJ] 배열 돌리기 1 - 16926 (G5)

시간 제한메모리 제한
1 초512 MB

문제

크기가 N×M인 배열이 있을 때, 배열을 반시계 방향으로 R번 회전시키려고 한다. 배열의 회전은 각 껍질 별로 독립적으로 일어난다.

풀이

구현 문제이다. 각 껍질을 추출하고 회전시킨 후 다시 배치한다.

코드

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)


Share this post:

비슷한 글

16926이 글

본문을 Xenova/multilingual-e5-small 로 임베딩하고, 그 벡터를 PCA 로 32축에 눌러 왼쪽 막대로 그렸습니다. 비슷한 글은 지문도 닮습니다 — 위아래를 견줘 보세요. 계산은 빌드 때 끝나고 벡터는 브라우저로 오지 않습니다.

Previous Post
[BOJ] 킥다운 - 1195 (S1)
Next Post
[BOJ] 배열 돌리기 - 17276 (S1)