728x90
https://www.acmicpc.net/problem/17276
# 조건
- 크기가 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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 1484번] 파이썬 - 다이어트 (1) | 2022.12.03 |
---|---|
[백준 5525번] 파이썬 - IOIOI (0) | 2022.10.12 |
[백준 18870번] 파이썬 - 좌표 압축 (1) | 2022.10.08 |
[백준 11723번] 파이썬 - 집합 (0) | 2022.09.22 |
[백준 10989] 파이썬 - 수 정렬하기 3 (0) | 2022.09.17 |