[백준 16926] 배열돌리기1(Python)

알고리즘 저장소·2021년 4월 6일
0

백준

목록 보기
11/41

1. 요약

배열을 r만큼 반시계 방향으로 돌리는 문제

2. 아이디어

배열의 행의 길이(높이)와 열의 길이(너비)를 이용한다.

초기에 y,x를 (0,0)으로 설정하고 가장 겉에 있는 테두리부터 돌린다. 이를 위해 높이 값과 너비 값을 이용한다. 시계 방향으로 테두리에 있는 값들을 큐에 담는다. 그리고 큐에 있는 원소들을 우측 방향으로 회전(또는 이동)시킨다.(python의 경우 deque에서 제공하는 rotate(-r)을 이용)

이후 큐에 있는 원소를 꺼내서 시계 방향으로 테두리의 값들을 넣는다. 완료가 되면 높이와 너비를 각각 2씩 차감하고 y,x를 각 1씩 더한다.

위의 과정을 높이 값이 0이 되거나 너비 값이 0이 될 때까지 시행한다.


3. 코드


import sys
from collections import deque

n, m, r = map(int, sys.stdin.readline().rstrip().split())
arr = [list(map(int,sys.stdin.readline().rstrip().split())) for _ in range(n)]

def rotate(y, x, height, width):
    global arr
    q = deque()

    for i in range(x, x+width):
        q.append(arr[y][i])
    
    for i in range(y+1, y+height):
        q.append(arr[i][x+width-1])
    
    for i in range(x+width-2, x, -1):
        q.append(arr[y+height-1][i])
    
    for i in range(y+height-1, y, -1):
        q.append(arr[i][x])

    q.rotate(-r)

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

height = n
width = m
y, x = 0, 0

while True:
    if height == 0 or width == 0: break

    rotate(y, x, height, width)
    y += 1
    x += 1
    height -= 2
    width -= 2

for i in range(n):
    for j in range(m):
        print(arr[i][j], end = ' ')
    print()

0개의 댓글