https://www.acmicpc.net/problem/17276
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
풀이
1 ≤ T ≤ 10
1 ≤ n < 500, n은 홀수
0 ≤ |d| ≤ 360 , n은 45의 배수
-> 0 ≤ |d| / 45 ≤ 8
d < 0이면 d += 360
d를 45로 나눈 다음에, 그 횟수만큼 배열을 회전시킨다.
시간복잡도: T * (n^2 + 8*n/2) -> O(T*n^2)
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int degree = Integer.parseInt(st.nextToken());
if (degree < 0) degree += 360;
degree /= 45;
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
while (degree-- > 0) { // degree 횟수만큼 배열을 시계방향으로 45도 회전
rotate(arr);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
bw.write(arr[i][j] + " ");
}
bw.write("\n");
}
}
bw.flush();
br.close();
bw.close();
}
static void rotate(int[][] arr) {
int n = arr.length;
int[] copy = new int[n/2];
// 가운데 열 위쪽 숫자들을 미리 copy 배열에 저장
for (int i = 0; i < n/2; i++) {
copy[i] = arr[i][n/2];
}
// 8개의 줄 이동시키기
for (int i = 0; i < n/2; i++) {
arr[i][n/2] = arr[i][i];
arr[i][i] = arr[n/2][i];
arr[n/2][i] = arr[n-i-1][i];
arr[n-i-1][i] = arr[n-i-1][n/2];
arr[n-i-1][n/2] = arr[n-i-1][n-i-1];
arr[n-i-1][n-i-1] = arr[n/2][n-i-1];
arr[n/2][n-i-1] = arr[i][n-i-1];
arr[i][n-i-1] = copy[i];
}
}
}
수정한 풀이
길이가 n/2인 8개의 줄을 이동시키는 것이 아니라, 길이가 n인 4개의 줄(대각선)을 이동시키면 된다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int degree = Integer.parseInt(st.nextToken());
if (degree < 0) degree += 360;
degree /= 45;
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
while (degree-- > 0) { // degree 횟수만큼 배열을 시계방향으로 45도 회전
rotate(arr);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
bw.write(arr[i][j] + " ");
}
bw.write("\n");
}
}
bw.flush();
br.close();
bw.close();
}
static void rotate(int[][] arr) {
int n = arr.length;
int[] copy = new int[n];
// 가운데 열 숫자들을 미리 copy 배열에 저장
for (int i = 0; i < n; i++) {
copy[i] = arr[i][n/2];
}
// 4개의 줄 이동시키기
for (int i = 0; i < n; i++) {
arr[i][n/2] = arr[i][i];
arr[i][i] = arr[n/2][i];
arr[n/2][i] = arr[n-i-1][i];
arr[n-i-1][i] = copy[n-1-i]; // 순서 반대로 해서 집어넣기
}
}
}
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 15683번 : 감시 - 자바[Java] (0) | 2023.10.04 |
---|---|
[백준] 17140번 : 이차원 배열과 연산 - 자바[Java] (0) | 2023.10.04 |
[백준] 14891번 : 톱니바퀴 - 자바[Java] (0) | 2023.09.25 |
[백준] 17144번 : 미세먼지 안녕! - 자바[Java] (0) | 2023.08.16 |
[백준] 16719번 : ZOAC - 자바[Java] (0) | 2023.08.15 |