Algorithm
백준 17276번 <배열 돌리기>
seungh2
2022. 2. 15. 17:02
백준 알고리즘 17276번
https://www.acmicpc.net/problem/17276
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
17276번
입력으로 첫 줄에는 테스트케이스의 수 T가 주어진다.
그 다음 T개의 테스트케이스에 대한 정보가 주어진다.
해당 정보는 첫 줄에 배열의 크기를 나타내는 n과 각도 D가 주어진다.
그 다음 n개의 줄에 걸쳐 배열이 들어온다.
출력으로는 T개의 테스트케이스에 대해 d만큼 돌린 후 배열의 상태를 출력한다.
문제 해결
배열을 돌리는 회전 연산은 주 대각선, 부 대각선, 가운데 행, 가운데 열에 있는 좌표를 회전한다.
따라서 회전 연산은 3*3 배열이 돌아간다고 보면 된다.
처음에는 그림1의 3*3 배열이 돌아가고
그 다음에는 그림2의 3*3 배열이 돌아간다.
N//2까지 배열이 돌아가면 회전 연산이 끝난다.
코드
testcase = int(input())
def spin(N, d, Map):
newMap = [[Map[i][j] for j in range(N)] for i in range(N)]
idx = N-1
halfN = N // 2
for k in range(halfN+1):
if k == idx:
continue
tpK = (k + idx)//2
temp = [(0, 0) for _ in range(8)]
temp[0] = (k, k)
temp[1] = (k, tpK)
temp[2] = (k, idx)
temp[3] = (tpK, idx)
temp[4] = (idx, idx)
temp[5] = (idx, tpK)
temp[6] = (idx, k)
temp[7] = (tpK, k)
for i in range(8):
spIX = i + d
if d < 0 and spIX < 0:
spIX += 8
if d >= 0 and spIX >= 8:
spIX %= 8
newMap[temp[spIX][0]][temp[spIX][1]] = Map[temp[i][0]][temp[i][1]]
idx -= 1
return newMap
for t in range(testcase):
n, D = map(int, input().split())
MAP = [list(map(int, input().split())) for _ in range(n)]
newMAP = spin(n, (D//45), MAP)
for i in range(n):
for j in range(n):
print(newMAP[i][j], end=" ")
print("")
3*3 배열에 대한 index를 temp 배열에 저장했다.
for문을 돌려서 d만큼 돌린 newMap을 구했다. 이때 인덱스 spIX는 for문의 변수 i와 d를 더한 값이다. d가 0보다 작고 spIX가 0보다 작으면 spIX에 8을 더하고 d가 0보다 크거나 같고 spIX가 8보다 크거나 같으면 8로 나눈 나머지 값이 spIX가 된다.
결과
728x90