영역의 테두리 숫자만 한칸씩 시계방향으로 회전. 이 때 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 반환
rows | columns | queries | result |
---|---|---|---|
6 | 6 | [[2,2,5,4],[3,3,6,6],[5,1,6,3]] | [8, 10, 25] |
3 | 3 | [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] | [1, 1, 5, 3] |
100 | 97 | [[1,1,100,97]] | [1] |
행렬을 만들고 4가지 부분으로 나누어 회전. 제일 왼쪽 위 숫자를 기준으로 잡는다. 부분을 회전할 때마다 최솟값을 구해 저장한다.
- 회전시키기 위해서는 기준이 되는 빈 칸이 하나 있어야 한다.
- 왼쪽 상단을 기준으로 잡고, 회전은 시계 방향으로 진행되므로 왼쪽 끝을 올리고 맨 밑 줄을 왼쪽으로 옮기고 오른쪽 끝을 내리고 맨 윗 줄을 오른쪽으로 밀어준다.
(⬆ ⬅ ⬇ ➡ 순서대로 진행)- 마지막으로 기준이 되었던 수를 있어야 할 곳에 돌려놓는다.
- 회전을 시키면서 동시에 값을 비교하며 최솟값을 찾는다.
- 받는애 입장에서 생각
def solution(rows, columns, queries):
matrix = [[0]*columns for _ in range(rows)]
k = 1
for i in range(rows):
for j in range(columns):
matrix[i][j] = k
k += 1
ans = []
for x1, y1, x2, y2 in queries:
a = matrix[x1-1][y1-1]
v = a
# 위로
for x in range(x1-1, x2-1):
matrix[x][y1-1] = matrix[x+1][y1-1]
v = min(v, matrix[x][y1-1])
# 왼쪽으로
for y in range(y1-1, y2-1):
matrix[x2-1][y] = matrix[x2-1][y+1]
v = min(v, matrix[x2-1][y])
# 아래로
for x in range(x2-1, x1-1, -1):
matrix[x][y2-1] = matrix[x-1][y2-1]
v = min(v, matrix[x][y2-1])
# 오른쪽으로
for y in range(y2-1, y1-1, -1):
matrix[x1-1][y] = matrix[x1-1][y-1]
v = min(v, matrix[x1-1][y])
matrix[x1-1][y1] = a
ans.append(v)
return ans