[Programmers] 행렬 테두리 회전하기

Updated:

행렬 테두리 회전하기

행렬 테두리 회전하기 를 클릭하면 바로 이동한다.


주어진 쿼리문을 통해 가능한 최소 행, 최대 행, 최소 열, 최대 열을 구해 시계방향으로 회전 범위를 구하며 값도 저장한다.

그리고 맨 마지막 인덱스에 있는 값을 빼 맨 처음 인덱스로 넣어준 뒤 회전 범위를 돌며 값을 다시 대입해 주면 시계방향으로 회전이 된다.

이때 최솟값도 같이 구하면 된다.


from collections import deque


def solution(rows, columns, queries):
    answer = []

    # 1. 배열 초기화
    arr = [[0 for _ in range(columns)] for _ in range(rows)]
    num = 1
    for i in range(rows):
        for j in range(columns):
            arr[i][j] = num
            num += 1

    # 2. 쿼리문 마다 회전 범위 시계방향으로 구하기
    for querie in queries:
        rotate = deque([])
        rotate_index = []
        min_i, max_i = querie[0] - 1, querie[2] - 1
        min_j, max_j = querie[1] - 1, querie[3] - 1

        # 2-1 오른쪽 방향
        for j in range(min_j, max_j + 1):
            rotate.append(arr[min_i][j])
            rotate_index.append([min_i, j])

        # 2-2 아래쪽 방향
        for i in range(min_i + 1, max_i + 1):
            rotate.append(arr[i][max_j])
            rotate_index.append([i, max_j])

        # 2-3 왼쪽 방향
        for j in range(max_j - 1, min_j - 1, -1):
            rotate.append(arr[max_i][j])
            rotate_index.append([max_i, j])

        # 2-4 위쪽 방향
        for i in range(max_i - 1, min_i - 1, -1):
            rotate.append(arr[i][min_j])
            rotate_index.append([i, min_j])
        answer.append(min(rotate))

        # 2-6 회전 범위를 통해 회전 시키기
        rotate.appendleft(rotate.pop())
        for index, num in zip(rotate_index, rotate):
            arr[index[0]][index[1]] = num

    return answer


if __name__ == "__main__":
    rows = 3
    columns = 3
    queries = [[1, 1, 2, 2], [1, 2, 2, 3], [2, 1, 3, 2], [2, 2, 3, 3]]

    print(solution(rows, columns, queries))



Categories:

Updated:

Leave a comment