[백준] 16926번 배열 돌리기 1 JAVA (자바) 풀이
문제 1707
- 크기가 N×M인 배열이 있을 때, 배열을 다음과 같이 반시계 방향으로 돌려야 한다
A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5]
↓ ↑
A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예) 아래와 같은 배열을 2번 회전시키면 다음과 같다
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
[입력]
: 첫째 줄에 배열의 크기 N, M, 회전 수 R
: 둘째 줄부터 N개의 줄에 배열 A의 원소 Aij
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
[출력]
: 배열을 R번 회전시킨 결과
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
[문제접근]
[참고]
[코드]
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));
StringBuilder sb=new StringBuilder();
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());
int arr[][] = new int[N][M];
for(int i=0; i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j =0; j<M;j++){
arr[i][j]=Integer.parseInt(st.nextToken());
}
}
for(int i=0; i<R; i++){
for(int j=0; j<Math.min(N,M)/2; j++){
int temp = arr[j][j];
for(int k=j; k<M-j-1; k++) {
arr[j][k] = arr[j][k+1];
}
for(int k=j; k<N-1-j; k++) {
arr[k][M-j-1] = arr[k+1][M-j-1];
}
for(int k=M-j-1; k>j; k--) {
arr[N-1-j][k] = arr[N-1-j][k-1];
}
for(int k=N-j-1; k>j; k--) {
arr[k][j] = arr[k-1][j];
}
arr[j+1][j] = temp;
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
sb.append(arr[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
}
[해설]
: int N = Integer.parseInt(st.nextToken()); 배열 가로
int M = Integer.parseInt(st.nextToken()); 배열 세로
int R = Integer.parseInt(st.nextToken()); 회전 수
int arr[][] = new int[N][M]; 배열판 초기화
for(int i=0; i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j =0; j<M;j++){
arr[i][j]=Integer.parseInt(st.nextToken()); 배열판에 입력받기
}
}
for(int i=0; i<R; i++){
for(int j=0; j<Math.min(N,M)/2; j++){ 테두리 하나씩 따져보기
int temp = arr[j][j]; 테두리의 값들 저장
for(int k=j; k<M-j-1; k++) {
arr[j][k] = arr[j][k+1]; 왼쪽에서 오른쪽으로 이동
}
for(int k=j; k<N-1-j; k++) {
arr[k][M-j-1] = arr[k+1][M-j-1]; 위에서 아래로 이동
}
for(int k=M-j-1; k>j; k--) {
arr[N-1-j][k] = arr[N-1-j][k-1]; 오른쪽에서 왼쪽으로 이동
}
for(int k=N-j-1; k>j; k--) {
arr[k][j] = arr[k-1][j]; 아래에서 위로 이동
}
arr[j+1][j] = temp;
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
sb.append(arr[i][j]).append(" "); 배열 출력
}
sb.append("\n");
}
System.out.println(sb); 출력
이제 풀어보러 갈께요 :)

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *
16926번: 배열 돌리기 1
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
www.acmicpc.net