https://www.acmicpc.net/problem/16926
● 배열을 돌리기 위한 다양한 방법 중에 deque.rotate()를 사용하는 방법을 택했다.
● 2차원의 배열을 1차원으로 바꿔준다음에 rotate()를 돌리면 된다.
● 반시계 방향이기때문에 순서에 유의하며 1차원으로 바꿔주고 몇번 회전을 시킬껀지 rotate(r) 해준다.
● 똑같은 순서에 맞춰서 deque.popleft()를 하며 값을 꺼내서 저장해주면 가장자리의 회전이 끝난다.
● 가장자리 후 그 안의 있는 배열에 대한 접근은 시작지점 (x,y)가 (x+1,y+1)이 되고 width,height는 -2씩 된다.
● width, height 둘 중 하나가 0이 되면 끝나면 회전을 멈추게 된다.
from collections import deque
n,m,r = list(map(int,input().split()))
data = [list(map(int,input().split())) for _ in range(n)]
x,y = 0,0
width = m
height = n
#x,y : 배열 왼쪽 상단
#반시계 기준
def rotate(x,y,width,height):
queue = deque()
for i in range(y,y+width): #좌
queue.append(data[x+height-1][i])
for i in range(x+height-2,x,-1): #상
queue.append(data[i][y+width-1])
for i in range(y+width-1,y,-1): #우
queue.append(data[x][i])
for i in range(x,x+height-1): #하
queue.append(data[i][y])
queue.rotate(r)
for i in range(y,y+width): #좌
data[x+height-1][i] = queue.popleft()
for i in range(x+height-2,x,-1): #상
data[i][y+width-1] = queue.popleft()
for i in range(y+width-1,y,-1): #우
data[x][i] = queue.popleft()
for i in range(x,x+height-1): #하
data[i][y] = queue.popleft()
while True:
if not width or not height:
break
rotate(x,y,width,height)
x += 1
y += 1
width -= 2
height -= 2
for i in data:
print(*i)
'Algorithm > Algorithm Problem' 카테고리의 다른 글
백준 9421 소수상근수(소수) (0) | 2022.06.26 |
---|---|
백준 2872 우리집엔 도서관이 있어(그리디) (0) | 2022.06.08 |
백준 1461 도서관(구현, 그리디) (0) | 2022.06.03 |
백준 16943 숫자 재배치(순열, 구현) (0) | 2022.06.03 |
백준 1911 흙길 보수하기(구현,그리디) (0) | 2022.06.03 |