📖 문제
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
💡 풀이 방식
• 구현
지문에서 알려준대로 그대로 구현하면 되더라,,,
1. 주대각선 \ (i, i)을 가운데 열 - (i, n / 2)로 옮긴다.
2. 가운데 열 | (i, n /2)을 부대각선 / (n - i, i)으로 옮긴다.
3. 부대각선 / (n - i, i)을 가운데 행 - (n/2, i)으로 옮긴다.
4. 가운데 행 - (n/2, i)을 주대각선 \ (i, i)으로 옮긴다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
import java.util.*;
import java.io.*;
public class Main {
static int T, n, d;
static int[][] grid, copy;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
T = Integer.parseInt(br.readLine());
while(T --> 0) {
st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
grid = new int[n][n]; // 원본 배열
copy = new int[n][n]; // 변경된 값 저장할 배열
for(int i = 0 ; i < n ; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0 ; j < n ; j++) {
grid[i][j] = Integer.parseInt(st.nextToken());
copy[i][j] = grid[i][j];
}
}
// 각도 조정
if(d < 0) d += 360;
if(d >= 360) d -= 360;
// (d/45)번 회전시킴
int cnt = d/45;
while(cnt --> 0) {
rotate();
}
// 회전한 결과 출력하기
for(int[] i : grid) {
for(int j : i) {
sb.append(j + " ");
}
sb.append("\n");
}
}
System.out.println(sb);
}
private static void rotate() {
for(int i = 0 ; i < n ; i++) {
copy[i][n / 2] = grid[i][i]; // 1. 주 대각선(\)을 가운데 열(|)로 옮김
copy[n - 1 - i][i] = grid[n - 1 - i][n / 2]; // 2. 가운데 열(|)을 부 대각선(/)으로 옮김
copy[n / 2][i] = grid[n - 1 - i][i]; // 3. 부 대각선(/)을 가운데 행(-)으로 옮김
copy[i][i] = grid[n / 2][i]; // 4. 가운데 행(-)을 주 대각선(\)으로 옮김
}
// 45도 회전한 결과 원본 배열에 반영하기
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
grid[i][j] = copy[i][j];
}
}
}
}
|
cs |
➕ 다른 풀이 방식
내가 초기에 생각했던 방법과 비슷하시다. (dx/dy 활용)
[BOJ] 배열 돌리기 17276.JAVA
문제 링크 : https://www.acmicpc.net/problem/17276 이 문제는 배열 돌리기 1을 먼저 푼 후 접근하였다. nkt-docs.tistory.com/18 [BOJ] 배열 돌리기 1 16926.JAVA 문제 링크 : https://www.acmicpc.net/problem/16926 처음 시도에는
nkt-docs.tistory.com
💦 어려웠던 점
다음엔 공식이 주어지지 않더라도 스스로 빠르게 해결책을 생각해내자,,
문제 잘못 이해하고 혼자 삽질하고 있었다,,
TC 다양하게 만들어봐서 맞는지 제대로 확인하기!!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 240620 |
(+240620 2회독 190464KB, 1088ms)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
import java.util.*;
import java.io.*;
public class Main {
static int T, N, d;
static int[][] map, copy;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
T = Integer.parseInt(br.readLine());
while(T --> 0) {
st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
if(d < 0) d += 360;
map = new int[N][N];
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0 ; j < N ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i = 0 ; i <= d/45 ; i++) {
if(i == 0) continue;
rotate(i);
}
print();
}
System.out.println(sb.toString());
}
// 회전 메소드
private static void rotate(int num) {
// 원본 배열 복사하기
copy = new int[N][N];
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < N ; j++) {
copy[i][j] = map[i][j];
}
}
for(int i = 0 ; i < N ; i++) {
copy[i][N/2] = map[i][i]; // 주 대각선 > 가운데 대각선
copy[i][N-1-i] = map[i][N/2]; // 가운데 대각선 > 부 대각선
copy[N/2][N-1-i] = map[i][N-1-i]; // 부 대각선 > 가운데 행
copy[i][i] = map[N/2][i]; // 가운데 행 > 주 대각선
}
// 회전한 결과 반영하기기
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < N ; j++) {
map[i][j] = copy[i][j];
}
}
}
// 출력 메소드
private static void print() {
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < N ; j++) {
sb.append(map[i][j] + " ");
}
sb.append("\n");
}
}
}
|
cs |
(참고)
[ 백준 / BOJ 17276 ] 배열 돌리기 ( 자바 / JAVA )
https://www.acmicpc.net/problem/17276 17276번: 배열 돌리기 각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다. www.acmicpc
hyeyun.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 20164번: 홀수 홀릭 호석 (0) | 2024.01.14 |
---|---|
[백준/JAVA] 10994번: 별 찍기 - 19 (0) | 2024.01.13 |
[백준/JAVA] 17413번: 단어 뒤집기 2 (0) | 2024.01.12 |
[백준/JAVA] 1244번: 스위치 켜고 끄기 (0) | 2024.01.09 |
[백준/JAVA] 1325번: 효율적인 해킹 (0) | 2024.01.04 |