본문 바로가기
Baekjoon/[7] 기타

[백준] 16926번 배열 돌리기 1 JAVA (자바) 풀이

by Poorm 푸름 2024. 1. 23.
 

문제 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