rows x columns 크기의 행렬에 1부터 rows x columns 까지 정수가 오름차순으로 저장되어 있다.
x1행 y1열부터 x2행 y2열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한칸씩 시계 방향으로 회전한다.
매 회전마다 회전하는 정수 중 가장 작은 수를 배열에 담아 반환한다.
def solution(rows, columns, queries):
answer = []
# 2차원 배열 생성 및 초기화
arr = [[j+1 for j in range(columns*i, columns*(i+1))] for i in range(rows)]
# 값 회전
for x1, y1, x2, y2 in queries:
# 좌측 상단 원소 임시 저장
tmp = arr[x1-1][y1-1]
# 임시 저장한 값으로 최소값 변수 초기화
min_ = tmp
# 왼쪽열 (위로 이동)
for i in range(x1-1, x2-1):
# 최소값 갱신
min_ = min(min_, arr[i+1][y1-1])
# 아래열에서 위열로 원소 복사
arr[i][y1-1] = arr[i+1][y1-1]
# 아래행 (왼쪽으로 이동)
for i in range(y1-1, y2-1):
# 최소값 갱신
min_ = min(min_, arr[x2-1][i+1])
# 왼쪽에서 오른쪽으로 원소 복사
arr[x2-1][i] = arr[x2-1][i+1]
# 오른쪽열 (아래로 이동)
for i in range(x2-1, x1-1, -1):
# 최소값 갱신
min_ = min(min_, arr[i-1][y2-1])
# 왼쪽에서 오른쪽으로 원소 복사
arr[i][y2-1] = arr[i-1][y2-1]
# 위행 (오른쪽으로 이동)
for i in range(y1-1, y2-1):
# 최소값 갱신
min_ = min(min_, arr[x1-1][i+1])
# 왼쪽에서 오른쪽으로 원소 복사
arr[x1-1][i] = arr[x1-1][i+1]
# 임시저장 했던 좌측 상단 원소 넣어주기
arr[x1-1][y1] = tmp
# 회전한 원소 중 최소값 배열에 넣어주기
answer.append(min_)
return answer
코드 실행에서 제공하는 테스트 케이스는 전부 통과했는데 막상 제출하니 전부 실패로 떴다.
회전이 다 된 배열을 프린트해서 돌려보니 회전이 잘못 되고 있었다.
요행히도 잘못된 회전이 최소값 계산에 영향을 주기 전에 문제가 끝나서 통과로 떴던 것 같다.
다시 꼼꼼하게 회전하는 식을 고쳐주었다.
원인은 회전 마지막 단계인 위행에서 오른쪽으로 이동할 때 (가장 오른쪽 순서부터 하나 왼쪽 것을 가져와서 복사) 반복문을 역순으로 지정해주지 않아서였다.
고쳐서 완성한 최종코드는 다음과 같다.
def solution(rows, columns, queries):
answer = []
# 2차원 배열 생성 및 초기화
arr = [[j+1 for j in range(columns*i, columns*(i+1))] for i in range(rows)]
# 값 회전
for x1, y1, x2, y2 in queries:
# 좌측 상단 원소 임시 저장
tmp = arr[x1-1][y1-1]
# 임시 저장한 값으로 최소값 변수 초기화
min_ = tmp
# 왼쪽열 (위로 이동)
for i in range(x1-1, x2-1):
# 최소값 갱신
min_ = min(min_, arr[i+1][y1-1])
# 아래열에서 위열로 원소 복사
arr[i][y1-1] = arr[i+1][y1-1]
# 아래행 (왼쪽으로 이동)
for i in range(y1-1, y2-1):
# 최소값 갱신
min_ = min(min_, arr[x2-1][i+1])
# 왼쪽에서 오른쪽으로 원소 복사
arr[x2-1][i] = arr[x2-1][i+1]
# 오른쪽열 (아래로 이동)
for i in range(x2-1, x1-1, -1):
# 최소값 갱신
min_ = min(min_, arr[i-1][y2-1])
# 왼쪽에서 오른쪽으로 원소 복사
arr[i][y2-1] = arr[i-1][y2-1]
# 위행 (오른쪽으로 이동)
for i in range(y2-1, y1-1, -1):
# 최소값 갱신
min_ = min(min_, arr[x1-1][i-1])
# 왼쪽에서 오른쪽으로 원소 복사
arr[x1-1][i] = arr[x1-1][i-1]
# 임시저장 했던 좌측 상단 원소 넣어주기
arr[x1-1][y1] = tmp
# 회전한 원소 중 최소값 배열에 넣어주기
answer.append(min_)
print(arr)
return answer