문제
풀이
- 회전이 발생하는 4가지 행을 각각 그룹화 한다. 이 때 여러 그룹에 중복으로 사용되는 인덱스가 존재한다.
- 문제에서 주어진 각도 d 를 통해 회전을 몇 번 반복해야 되는지 구한다.
- 시계 방향과 반시계 방향에 따라 회전을 다르게 구현한다.
- 반시계 방향은 가장 앞의 행을 가장 뒤로 이동시킨다.
- 시계 방향은 가장 뒤의 행을 가장 앞으로 이동시킨다.
소스 코드
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs")
.readFileSync(filePath)
.toString()
.trim()
.split("\n");
let T = +input[0];
let index = 1;
let answer = "";
while (T > 0) {
const [n, d] = input[index].split(" ").map((el) => +el);
const arr = Array.from({ length: n }, () => Array(n).fill(0));
for (let i = index + 1; i < index + 1 + n; i++) {
const temp = input[i].split(" ").map((el) => +el);
for (let j = 0; j < n; j++) {
arr[i - (index + 1)][j] = temp[j];
}
}
const rows = Array.from({ length: 4 }, () => []); // 4가지 행을 저장
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
// 중복으로 포함되는 수가 존재
if (Math.floor(n / 2) === i) rows[0].push(arr[i][j]);
if (i === j) rows[1].push(arr[i][j]);
if (Math.floor(n / 2) === j) rows[2].push(arr[i][j]);
if (i === n - 1 - j) rows[3].push(arr[i][j]); // (0, 4) (1, 3), (2, 2), (3, 1), (4, 0)
}
}
let count = d >= 0 ? d / 45 : (d / 45) * -1;
while (count--) {
if (d < 0) {
const first = rows.shift();
first.reverse(); // 역순, 이동 시킨 행은 항상 역순이 된다.
rows.push(first);
} else {
const last = rows.pop();
last.reverse();
rows.unshift(last);
}
}
const x = Math.floor(n / 2);
for (let i = 0; i < 4; i++) {
for (let j = 0; j < rows[i].length; j++) {
if (i == 0) arr[x][j] = rows[i][j];
else if (i == 1) arr[j][j] = rows[i][j];
else if (i == 2) arr[j][x] = rows[i][j];
else if (i == 3) arr[j][n - 1 - j] = rows[i][j];
}
}
for (let i = 0; i < n; i++) {
answer += arr[i].join(" ") + "\n";
}
index += n + 1;
T -= 1;
}
console.log(answer);