티스토리 뷰
https://www.acmicpc.net/problem/16926
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class P16926_1 {
static int N, M, R;
static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine(), " ");
N=Integer.parseInt(st.nextToken());
M=Integer.parseInt(st.nextToken());
R=Integer.parseInt(st.nextToken());
graph=new int[N][M];
for (int i=0; i<N; i++) {
st=new StringTokenizer(br.readLine(), " ");
for (int j=0; j<M; j++) {
graph[i][j]=Integer.parseInt(st.nextToken());
}
}
for (int i=0; i<R; i++) {
rotate();
}
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
System.out.print(graph[i][j]+" ");
}
System.out.println();
}
}
private static void rotate() {
int cnt=Math.min(N, M)/2;
for (int i=0; i<cnt; i++) {
int y=i, x=i;
int temp=graph[y][x];
int Mmax=(M-i)-1;
int Nmax=(N-i)-1;
while (x<Mmax) {
graph[y][x]=graph[y][x+1];
x++;
}
while (y<Nmax) {
graph[y][x]=graph[y+1][x];
y++;
}
while (x>i) {
graph[y][x]=graph[y][x-1];
x--;
}
while (y>i) {
graph[y][x]=graph[y-1][x];
y--;
}
graph[i+1][i]=temp;
}
}
}
여기서 중요한 포인트는 돌릴 직사각형의 개수를 구하는 것이다. (i번째 직사각형)
돌릴 직사각형의 개수는 min(N, M)/2 로 구해주고, 각 직사각형 당 시계방향으로 값을 바꿔준다.
여기서 주의할 점은 경계 설정이다. 경계를 [i, N-i), [j, M-i) 로 설정해 경계를 만날 때마다 방향을 바꿔주도록 한다.
'Problem Solving' 카테고리의 다른 글
[SWEA 4615] 재미있는 오셀로 게임 (Java) (0) | 2022.02.14 |
---|---|
[BOJ 17413] 단어 뒤집기 2 (Java) (0) | 2022.02.13 |
[BOJ 2567] 색종이 - 2 (Java) (0) | 2022.02.10 |
[BOJ 1715] 카드 정렬하기 (Java) (0) | 2022.02.10 |
[BOJ 20056] 마법사 상어와 파이어볼 (Java) (0) | 2022.02.09 |