17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
문제
크기가 n x n인 2차원 정수 배열 X가 있다. (n은 홀수)
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의 다른 원소의 위치는 변하지 않는다.
반시계 방향으로 45° 돌리는 경우도 위와 비슷하게 정의된다.
예를 들어, 아래 그림 중앙에 5x5 배열 X가 있고, 이 배열을 시계방향 혹은 반시계방향으로 45° 돌렸을 때의 결과가 우측 그리고 좌측에 있다. 굵은 원소는 주 대각선 / 중간 열 / 부 대각선 / 중간 행에 위치한 원소이다.

입력으로 2차원 배열 X와 어느 방향으로 몇 도 회전할지 입력 받아, 그 결과를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 테스트 케이스의 수 T가 주어진다 (1 ≤ T ≤ 10).
각 테스트 케이스에 대해: 첫 줄에 배열의 크기를 나타내는 n (1 ≤ n < 500, n은 홀수) 그리고 각도 d가 주어진다. d는 0 ≤ |d| ≤ 360 을 만족하며 |d| 는 45의 배수이다. d가 양수이면 시계방향으로 d° 돌려야 하고, 음수이면 반시계방향으로 |d|° 돌려야 한다. 다음 n줄에 걸쳐 각 줄에 n개의 정수가 공백으로 구분되어 주어진다 (X의 원소들을 나타낸다). 각 값은 1 이상 1,000,000 이하의 정수이다.
출력
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
코드
from collections import deque
def rotation(x, n, d):
diagnol1 = deque([])
diagnol2 = deque([])
center_row = deque([])
center_col = deque([])
for i in range(n):
if i != n // 2:
diagnol1.append(x[i][i]) # 왼위->오른아래 대각선
diagnol2.append(x[i][n-1-i]) # 오른위->왼아래 대각선
center_row.append(x[n//2][i]) # 가운데 행
center_col.append(x[i][n//2]) # 가운데 열
if d > 0: # 시계 방향
for i in range(n):
if i == n//2:
continue
x[i][i] = center_row.popleft() # 왼위->오른아래 대각선
x[i][n-1-i] = center_col.popleft() # 오른위->왼아래 대각선
x[i][n//2] = diagnol1.popleft() # 가운데 열
x[n//2][i] = diagnol2.pop() # 가운데 행
else: # 반시계 방향
for i in range(n):
if i == n//2:
continue
x[i][i] = center_col.popleft() # 왼위->오른아래 대각선
x[i][n-1-i] = center_row.pop() # 오른위->왼아래 대각선
x[n//2][i] = diagnol1.popleft() # 가운데 행
x[i][n//2] = diagnol2.popleft() # 가운데 열
return x
for _ in range(int(input())):
n, d = map(int, input().split())
x = []
for _ in range(n):
x.append(list(map(int, input().split())))
for _ in range(abs(d) // 45):
rotation(x, n, d)
# 돌아간 x 출력
for i in range(n):
print(*x[i])
회전할 대상들(대각선, 가운데 행, 가운데 열)의 원소들을 각각 배열에 따로 저장해두었다가 회전하면 가야할 위치에 넣어준다.
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 16926번 배열 돌리기 1 (0) | 2023.02.24 |
---|---|
[Python/파이썬] 백준 15787번 기차가 어둠을 헤치고 은하수를 (0) | 2023.02.23 |
[Python/파이썬] 백준 21611번 마법사 상어와 블리자드 (0) | 2023.02.23 |
[Python/파이썬] 백준 4396번 지뢰 찾기 (0) | 2023.02.20 |
[Python/파이썬] 백준 2578번 빙고 (0) | 2023.02.19 |
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
문제
크기가 n x n인 2차원 정수 배열 X가 있다. (n은 홀수)
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의 다른 원소의 위치는 변하지 않는다.
반시계 방향으로 45° 돌리는 경우도 위와 비슷하게 정의된다.
예를 들어, 아래 그림 중앙에 5x5 배열 X가 있고, 이 배열을 시계방향 혹은 반시계방향으로 45° 돌렸을 때의 결과가 우측 그리고 좌측에 있다. 굵은 원소는 주 대각선 / 중간 열 / 부 대각선 / 중간 행에 위치한 원소이다.

입력으로 2차원 배열 X와 어느 방향으로 몇 도 회전할지 입력 받아, 그 결과를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 테스트 케이스의 수 T가 주어진다 (1 ≤ T ≤ 10).
각 테스트 케이스에 대해: 첫 줄에 배열의 크기를 나타내는 n (1 ≤ n < 500, n은 홀수) 그리고 각도 d가 주어진다. d는 0 ≤ |d| ≤ 360 을 만족하며 |d| 는 45의 배수이다. d가 양수이면 시계방향으로 d° 돌려야 하고, 음수이면 반시계방향으로 |d|° 돌려야 한다. 다음 n줄에 걸쳐 각 줄에 n개의 정수가 공백으로 구분되어 주어진다 (X의 원소들을 나타낸다). 각 값은 1 이상 1,000,000 이하의 정수이다.
출력
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
코드
from collections import deque def rotation(x, n, d): diagnol1 = deque([]) diagnol2 = deque([]) center_row = deque([]) center_col = deque([]) for i in range(n): if i != n // 2: diagnol1.append(x[i][i]) # 왼위->오른아래 대각선 diagnol2.append(x[i][n-1-i]) # 오른위->왼아래 대각선 center_row.append(x[n//2][i]) # 가운데 행 center_col.append(x[i][n//2]) # 가운데 열 if d > 0: # 시계 방향 for i in range(n): if i == n//2: continue x[i][i] = center_row.popleft() # 왼위->오른아래 대각선 x[i][n-1-i] = center_col.popleft() # 오른위->왼아래 대각선 x[i][n//2] = diagnol1.popleft() # 가운데 열 x[n//2][i] = diagnol2.pop() # 가운데 행 else: # 반시계 방향 for i in range(n): if i == n//2: continue x[i][i] = center_col.popleft() # 왼위->오른아래 대각선 x[i][n-1-i] = center_row.pop() # 오른위->왼아래 대각선 x[n//2][i] = diagnol1.popleft() # 가운데 행 x[i][n//2] = diagnol2.popleft() # 가운데 열 return x for _ in range(int(input())): n, d = map(int, input().split()) x = [] for _ in range(n): x.append(list(map(int, input().split()))) for _ in range(abs(d) // 45): rotation(x, n, d) # 돌아간 x 출력 for i in range(n): print(*x[i])
회전할 대상들(대각선, 가운데 행, 가운데 열)의 원소들을 각각 배열에 따로 저장해두었다가 회전하면 가야할 위치에 넣어준다.
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 16926번 배열 돌리기 1 (0) | 2023.02.24 |
---|---|
[Python/파이썬] 백준 15787번 기차가 어둠을 헤치고 은하수를 (0) | 2023.02.23 |
[Python/파이썬] 백준 21611번 마법사 상어와 블리자드 (0) | 2023.02.23 |
[Python/파이썬] 백준 4396번 지뢰 찾기 (0) | 2023.02.20 |
[Python/파이썬] 백준 2578번 빙고 (0) | 2023.02.19 |