17276 배열 돌리기

정민용·2023년 1월 30일

백준

목록 보기
2/286

# 45도 시계방향으로 돌렸을 경우
# 1. X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데 열 ((n+1)/2 번째 열)로 옮긴다.
# 2. X의 가운데 열을 X의 부 대각선으로 ((n, 1), (n-1, 2), …, (1, n)) 옮긴다. 
# 3. X의 부 대각선을 X의 가운데 행 ((n+1)/2번째 행)으로 옮긴다.
# 4. X의 가운데 행을 X의 주 대각선으로 옮긴다.
# 5. 위 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 한다.
# 6. X의 다른 원소의 위치는 변하지 않는다.

# 45도 반시계방향으로 돌렸을 경우
# 1. x의 주 대각선을 가운데 행으로 옮긴다.
# 2. x의 가운데 열을 x의 주 대각선으로 ((1,1), (2,2) ... (n,n)) 옮긴다.
# 3. x의 부 대각선을 x의 가운데 열로 옮긴다.
# 4. x의 가운데 행을 x의 부 대각선으로 옮긴다.
# 5. 위 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 한다.
# 6. x의 다른 원소의 위치는 변하지 않는다.

# 회전을 할 경우 영향을 받는 곳은 가운데 행과 열, 주부대각선이다.
# 가운데 행, 가운데 열, 주 대각선, 부 대각선 을 잘 찾고 서로 바꾸면 끝!

t = int(input())
for _ in range(t):
    n, d = map(int, input().split())
    my_arr = []
    for _ in range(n):
        my_arr.append(list(map(int, input().split())))
    
    while d % 360 != 0:
        main_dia, sub_dia, mid_row, mid_col = [], [], [], []
        middle = (n + 1) // 2
        for i in range(n):
            main_dia.append(my_arr[i][i])
            sub_dia.append(my_arr[i][n-i-1])
            mid_col.append(my_arr[i][middle - 1])
        mid_row = my_arr[middle - 1]

        if d >= 0 :
            # 시계 방향
            # 1. 주 대각선 -> 가운데 열
            # 2. 가운데 열 -> 부 대각선
            # 3. 부 대각선 -> 가운데 행
            # 4. 가운데 행 -> 주 대각선
            for i in range(n):
                my_arr[i][middle - 1] = main_dia[i]
                my_arr[i][n-i-1] = mid_col[i]
                my_arr[i][i] = mid_row[i]
                my_arr[middle - 1][i] = sub_dia[n-i-1]
            d -= 45
        else:
            # 반시계 방향
            # 1. 주 대각선 -> 가운데 행
            # 2. 가운데 열 -> 주 대각선
            # 3. 부 대각선 -> 가운데 열
            # 4. 가운데 행(뒤부터) -> 부 대각선
            for i in range(n):
                my_arr[i][middle - 1] = sub_dia[i]
                my_arr[i][n-i-1] = mid_row[n-i-1]
                my_arr[i][i] = mid_col[i]
            my_arr[middle - 1] = main_dia
            d += 45
    for i in range(n):
        print(*my_arr[i])

0개의 댓글