문제 링크
LV 2: 행렬 테두리 회전하기
구현 방식
- 백준에서 자주 다뤘던 내용이다
- 위쪽, 오른쪽, 아래쪽, 왼쪽 순서대로 queue에 extend 메소드를 이용해 껍데기를 채워준다
- 위쪽, 오른쪽, 아래쪽, 왼쪽 순서대로 for문을 돌며 queue에서 popleft한 결과를 arr에 채워준다
- 조금 헤맸던 부분이, 아래 두 코드의 결과가 다르다는 점이다
arr[x2][y1:y2+1][::-1]
arr[x2][y2:y1-1:-1]
- 배열을 역순으로 뒤집을 때, 1번의 경우처럼 먼저 2차원 배열에서 원소들을 모두 뽑고 나서 역순으로 slicing 해줘야한다
python list slicing 관련 의문점
arr = [1, 2, 3, 4, 5]
result1 = arr[::-1]
result2 = arr[len(arr)-1:-1:-1]
print(result1)
print(result2)
- slicing은 "start:stop:step" 형식
- arr[len(arr)-1] == arr[-1]로 start와 stop이 같아짐
- 두번째 인자를 비워놓으면 되긴하지만, 결론: 그냥 slicing을 두 번 쓰자
코드
from collections import deque
def solution(rows, columns, queries):
N = rows; M = columns
arr = []
for n in range(N):
tmp = []
for m in range(M):
tmp.append(m+1 + n*M)
arr.append(tmp)
result = []
for q in queries:
x1, y1, x2, y2 = q; x1 -= 1; y1 -= 1; x2 -= 1; y2 -= 1
queue = deque([])
queue.extend(arr[x1][y1:y2+1])
queue.extend([row[y2] for row in arr[x1+1:x2]])
queue.extend(arr[x2][y1:y2+1][::-1])
queue.extend([row[y1] for row in arr[x1+1:x2][::-1]])
queue.rotate(1)
result.append(min(list(queue)))
for i in range(y1, y2+1):
arr[x1][i] = queue.popleft()
for i in range(x1+1, x2):
arr[i][y2] = queue.popleft()
for i in range(y2, y1-1, -1):
arr[x2][i] = queue.popleft()
for i in range(x2-1, x1, -1):
arr[i][y1] = queue.popleft()
return result