본문 바로가기
👩🏻‍💻 Front-end/👾 Algorithm

프로그래머스 - 행렬 테두리 회전하기 (Python)

by su-no 2022. 6. 11.

문제

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

  • 회전을 수행하는 과정을 그림으로 표현하면 다음과 같습니다.

 

코드

def solution(rows, columns, queries):
    answer = []
    board = [[i*columns+j+1 for j in range(columns)] for i in range(rows)]

    for a, b, c, d in queries:
        stack = []
        x1, y1, x2, y2 = a-1, b-1, c-1, d-1

        for i in range(y1, y2+1):
            stack.append(board[x1][i])
            if len(stack) == 1:
                continue
            else:
                board[x1][i] = stack[-2]
        for j in range(x1+1, x2+1):
            stack.append(board[j][i])
            board[j][i] = stack[-2]
        for k in range(y2-1, y1-1, -1):
            stack.append(board[j][k])
            board[j][k] = stack[-2]
        for l in range(x2-1, x1-1, -1):
            stack.append(board[l][k])
            board[l][k] = stack[-2]

        answer.append(min(stack))
    return answer

 

풀이

  • 행렬 테두리가 시계방향으로 회전하므로, 위쪽, 오른쪽, 아래쪽, 왼쪽 테두리를 돌아가며 stack에 추가하고, stack[-2]를 할당해준다.
  • 이때 첫번째 칸의 숫자 (예제의 (1, 1): 8)는 stack[-2] 값이 아직 없으므로, 마지막 반복문에서 왼쪽 열을 처리할 때 할당해준다.