문제
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] 값이 아직 없으므로, 마지막 반복문에서 왼쪽 열을 처리할 때 할당해준다.
'👩🏻💻 Front-end > 👾 Algorithm' 카테고리의 다른 글
프로그래머스 - 약수의 개수와 덧셈 (Python) (0) | 2022.06.14 |
---|---|
프로그래머스 - 메뉴 리뉴얼 (Python) (0) | 2022.06.11 |
프로그래머스 - 타겟 넘버 (Python) (0) | 2022.06.09 |
프로그래머스 - 오픈채팅방 (Python) (0) | 2022.06.08 |
프로그래머스 - 체육복 (Python) (0) | 2022.06.08 |