1 minute read

16926번 : 배열 돌리기 1

문제 링크

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

문제 설명

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

그림1

예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.

그림2

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

입력

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

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

출력

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

제한

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

문제풀이

1번 회전할 때 아래/오른쪽/위/왼쪽 4방향의 작은 회전을 min(N, M) // 2회 만큼 하는 것을 염두로 두고 swap 진행

import sys
input = sys.stdin.readline

N, M, R = map(int, input().split())
arr = []
for _ in range(N) :
    arr.append(list(map(int, input().split())))

def rotation(iter) :
    global arr
    global N, M

    for _ in range(iter) :
        
        for k in range(min(N, M) // 2) :
            i, j = k, k
            prev = arr[k][k]
            
            for low in range(i+1, N-i) :
                arr[low][j], prev = prev, arr[low][j]
        
            for col in range(j+1, M-j) :
                arr[low][col], prev = prev, arr[low][col]
                
            for low in range(low-1, -1+i, -1) :
                arr[low][col], prev = prev, arr[low][col]
        
            for col in range(col-1, -1+j, -1) :
                arr[low][col], prev = prev, arr[low][col]
    
rotation(R)
for i in range(N) : 
    print(" ".join(map(str, arr[i])))

Comments