퍼즐
처럼(?) 생각하면 쉽게 이해가 될지도 모르겠다.
input으로 행과 열이 주어지고 query들이 주어지는데 행1 열1 행2 열2 순서로 주어진다. query들은 테두리가 되고 테두리에 해당하는 요소들은 전부 시계방향으로 회전시킨다.
그리고 마지막으로 회전시킨 요소들 중 가장 작은 값을 반환하면 된다.
def solution(rows, columns, queries):
answer = []
#matrix 0으로 초기화
matrix = [ [0] * columns for i in range(rows)]
num = 1
for i in range(rows):
for j in range(columns):
matrix[i][j] = num
num +=1
#print(matrix)
for q in queries:
#index로 접근하기 위해서 query로 들어온 값에 -1을 해주어 저장
r1, c1, r2, c2 = [q[i] -1 for i in range(len(q))]
if r1 == 1 and r2 == rows-1 and c1 == 1 and c1 == columns-1:
answer.append(1)
return answer
else:
# 1, 1, 4, 3
#가장 위의 값 저장
minValue = []
tmp = matrix[r1][c1]
#left
for idx in range(r1, r2):
#위로 한 칸 씩 이동
minValue.append(matrix[idx][c1])
matrix[idx][c1] = matrix[idx+1][c1]
#print(matrix)
#bottom
for idx in range(c1, c2):
#왼쪽으로 한 칸 씩 이동
minValue.append(matrix[r2][idx])
matrix[r2][idx] = matrix[r2][idx+1]
#print(matrix)
#right
for idx in range(r2, r1, -1):
#아래로 한 칸 씩 이동
minValue.append(matrix[idx][c2])
matrix[idx][c2] = matrix[idx-1][c2]
for idx in range(c2,c1, -1):
#오른쪽으로 한 칸 씩 이동
minValue.append(matrix[r1][idx])
matrix[r1][idx] = matrix[r1][idx-1]
matrix[r1][c1+1] = tmp
# print(matrix)
# print("====")
answer.append(min(minValue))
return answer
📌 고려해야할 점
위 그림의 분홍색 박스가 쳐진 테두리 부분들을 회전한다고 해보자. 이때, 시작점을 8로 잡고 회전할 것이기 때문에 8은 위의 코드에서처럼 tmp
라는 변수에 저장해둔다.
이제 left, bottom, right, top 순서대로 이동시켜보자.
[ Left 이동 & Bottom 이동]
위의 왼쪽 그림에서 8이 없어졌다고 가정하고 빈 공간으로 파란색으로 구분된 [14,20,26]을 차례로 밀어본다고 생각하자. 결과적으로 오른쪽 그림과 같이 옮겨지게 될 것이고 원래 26이 있던 자리는 빈 공간이 되고 이제 bottom에 해당하고 연두색으로 구분 된 [27,28]을 왼쪽으로 밀 수 있다.[ Right 이동 & Top 이동]
위의 왼쪽 그림에서 연두색으로 구분된 [27,28]이 이동된 것을 확인할 수 있다. 따라서, 원래 28이 있던 자리는 빈공간이 되므로 right에 해당하는 숫자들이 이동할 수 있다. 오렌지색으로 구분된 [10,16,22]는 한 칸 아래로 이동하게 될 것이다.[ 마지막 정리 ]
이제 마지막으로 Top의 이동까지 마무리되면 원래 9가 있던 자리는 빈 자리가 될 것이고 이 자리는 우리가 가장 맨 처음에 tmp
에 저장한 8 값을 저장해주면 된다.
물론 실제 코드에서는 원래 자리에 있던 숫자를 덮어쓰고 덮었는 과정이다. 내가 이 문제를 해결하기 위해서는 위의 과정들의 방법을 활용하였음을 참고하여 문제 해결을 하면 좋을 것 같다.