본문 바로가기
코딩테스트 파이썬/구현

16927 배열 돌리기 2

by 백엔드 개발자 2021. 7. 27.

문제

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.

 

배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.

제한

  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 109
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108

 

배열 돌리기의 또다른 연습문제 느낌이었다.

 

이번의 풀이방식 역시 deque의 rotate()를 활용했다.

 

어렵고 막혔던 부분은

배열을 데크에 append할 때 내부로 들어감에 따라서 for문과 배열의 변수가 달라지는 부분이었다.

배열의

시작값 행 :  ny,  열 : nx 가 된다. 

끝값은 행 : height-1+ny , 열 : width-1+nx 가 된다.

왜냐하면 height이란 width는 내부를 돌리러 들어갈 때 2씩 줄어드는데, 시작점이 nx,ny부터 돌리니까

그에 맞게 변형해줘야 한다. 이부분과 출력시 str로 하는것만 유의하면 할만하다.

 

 

 

from collections import deque
#n,m 입력받기
n,m,r=map(int, input().split())
arr=[
list(map(str,input().split())) for _ in range(n)]

limit=
min(n,m)//2
def move(r):
   
global limit,arr
    q=deque()
   
nx,ny=0,0
   
width=m
    height=n
# 높이
   
#1.반시계로 받기
    
for a in range(limit):
        nx
,ny=a,a

       
for i in range(height-1):
            q.append(arr[ny+i][nx])
       
for i in range(width - 1):
            q.append(arr[height-
1+ny][i+nx])

       
for i in range(height - 1):
            q.append(arr[height-
1-i+ny][width-1+nx])

       
for i in range(width - 1):
            q.append(arr[ny][width-
1-i+nx])

        q.rotate(r)
       
for i in range(height - 1):
           arr[ny + i][nx]=q.popleft()
       
for i in range(width - 1):
            arr[height -
1 + ny][i + nx]=q.popleft()

       
for i in range(height - 1):
            arr[height -
1 - i + ny][width - 1 + nx]=q.popleft()

       
for i in range(width - 1):
            arr[ny][width -
1 - i + nx]=q.popleft()
        width-=
2
       
height-=2

move(r)
for i in range(n):
   
print( ' '.join(arr[i]))