Algorithm/Algorithm Problem

백준 16926 배열 돌리기 1(구현) ★

땅지원 2022. 6. 4. 18:07

https://www.acmicpc.net/problem/16926

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

● 배열을 돌리기 위한 다양한 방법 중에 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)