728x90

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

 

17276번: 배열 돌리기

각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다. 

www.acmicpc.net

 

 

# 조건

  • 크기가 n x n 인 2차원 정수 배열 X
  • X를 45° 의 배수만큼 시계방향 혹은 반시계방향으로 돌리려고 한다. X를 시계 방향으로 45° 돌리면 아래와 같은 연산이 동시에 X에 적용되어야 한다:
    • X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데 열 ((n+1)/2 번째 열)로 옮긴다.
    • X의 가운데 열을 X의 부 대각선으로 ((n, 1), (n-1, 2), …, (1, n)) 옮긴다. 
    • X의 부 대각선을 X의 가운데 행 ((n+1)/2번째 행)으로 옮긴다.
    • X의 가운데 행을 X의 주 대각선으로 옮긴다.
    • 위 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 한다.
    • X의 다른 원소의 위치는 변하지 않는다.

# 접근 방법

  • 각 조건을 if문으로 만들어준다.
  • 이주 대각선 : i == j
  • 부 대각선 : i+j == N-1
  • 가운데 열 : j == N//2
  • 가운데 행 : i == N//2
  • 이 때, 위 조건의 뒷 부분 좌표가 나온다면, 앞 부분에서 들고와준다
  • 즉, 가운데 열이 나온다면 -> 주 대각선에서 들고오기
  • 회전을 여러 번 해야되는 경우가 있으므로 한 번 돌린 이후 deepcopy를 통해서 복사해준다.
  • -45도의 경우 시계방향으로 7번 돌린 것과 마찬가지이다.
import sys  
  
sys.stdin = open('input.txt')  
input = sys.stdin.readline  
from copy import deepcopy  
  
T = int(input())  
for tc in range(T):  
    N, rotate = map(int, input().split())  
    arr = [list(map(int, input().split())) for _ in range(N)]  
    # 결과 저장할 배열  
    result = [[0]*N for _ in range(N)]  
  
    if rotate < 0:  
        rotate = 360 + rotate  
    # 제자리 일 경우 그대로 출력  
    if rotate == 360 or rotate == 0:  
        for l in arr:  
            print(*l)  
    else:  
        # 45의 배수로 나오므로 나눈 몫만큼 반복해주어야 한다.  
        for _ in range(rotate//45):  
            for i in range(N):  
                for j in range(N):  
                    # 주 대각선이라면 가운데 행을 들고 와준다.  
                    if i==j:  
                        result[i][j] = arr[N//2][j]  
                    # 가운데 행이라면 부 대각선을 들고와준다.  
                    elif i == N//2:  
                        result[i][j] = arr[N-j-1][j]  
                    # 부 대각선이라면 가운데 열을 들고온다  
                    # 부 대각선 좌표 방법 2가지                    
                    # i+j = N-1                    
                    # N-j-1 = i                    
                    elif i+j == N-1:  
                        result[i][j] = arr[i][N//2]  
                    # 가운데 열이라면 주 대각선을 들고온다.  
                    elif j == N//2:  
                        result[i][j] = arr[i][i]  
  
                    # 모두 아니라면 같은 좌표값 들고오기  
                    else:  
                        result[i][j] = arr[i][j]  
            # 회전을 더해야할수도 있으므로 복사해주기  
            arr = deepcopy(result)  
  
        for k in result:  
            print(*k)  
        # print('=' * 20)
728x90