문제 보러 가기👈 클릭!
✔ 문제 파악
숫자가 순서대로 적힌 행렬이 있음. 직사각형 모양의 범위 [x1, y1, x2, y2]가 여러개 담겨져 있는 queries을 입력받음. queries의 원소 순서대로 행렬 위에서 직사각형을 잡고, 테두리에 존재하는 숫자들만 시계방향으로 이동. 그 중 제일 작은 값을 return.
첫번째 이동을 하고, 그 상태에서 변경없이 두번째 이동...그 상태에서 n번째 이동을 하고 이동했던 모든 숫자들 중 가장 작은 값을 return 함에 주의
✔ 풀이 방법
ex) board[(1,1)] = 1 , board[(1,2)] = 2 .. ,board[(rows, colunms)] = rows*colunms
시작 위치 start = (i, j)를 왼쪽 위 모서리로 정함. 오른쪽,아래,왼쪽,위 방향으로 순서대로 직사각형을 그리며 한 칸씩 숫자 이동
오른쪽 : i는 그대로. j는 1씩 증가
아래 : j는 그래도. i는 1씩 증가
왼쪽 : i는 그대로. j는 1씩 감소
위 : j는 그대로. i는 1씩 감소
다음과 시작 위치에 있는 값과 이동한 위치에 있는 값을 교환하며 계속하여 한 칸씩 이동. 교환할때마다 min함수를 사용하여 최솟값을 갱신.
def solution(rows, columns, queries):
answer = []
board, num = dict(), 1
for i in range(rows): #board[(위치)] = 위치에 있는 숫자
for j in range(columns):
board[(i+1, j+1)] = num
num += 1
for x1, y1, x2, y2 in queries:
start = (i, j) = (x1, y1) #첫 시작 위치
min_num = board[start] #최솟값
for n in [1, -1]:
for cnt in range(y2-y1):
j += n
board[start], board[i, j] = board[i, j], board[start]
min_num = min(min_num, board[start])
for cnt in range(x2-x1):
i += n
board[start], board[i, j] = board[i, j], board[start]
min_num = min(min_num, board[start])
answer.append(min_num)
return answer