[SWEA] 1961 - 숫자 배열 회전 (Java)

민영·2023년 5월 12일
0
post-thumbnail

Problem

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-OKAVYDFAUq


Approach & Logic

3X3 행렬일때 90도, 180도, 270도 회전했을때 모양을 보자.

결국, 180도 회전은 '90도 회전'x2 이고 270도 회전은 '90도 회전'x3 이기 때문에 90도 회전하는 함수를 만들어서 그 함수를 부르는 것이 훨씬 효율적이다.

이제 인덱스로 표현하는 것이 관건인데!
90도 회전한 행렬을 보면
0,0 자리에 이전 행렬의 2,0 값이
0,1 자리에 이전 행렬의 1,0 값이
0,2 자리에 이전 행렬의 0,0 값이 각각 왔다.

처음 행렬을 arr[][]라고 하고 90도 회전한 행렬을 result[][]라고 했을때 다음과 같이 표현할 수 있다.

for(int j=0; j<arrLength; j++) {
	for(int k=0; k<arrLength; k++) {
    	result[j][k] = arr[arrLength-1-k][j];
    }
}

Code

package SWEA;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class swea_1961 {
    static int arrLength;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer sb = new StringBuffer();

        int caseNum = Integer.parseInt(br.readLine());

        for(int i=1; i<=caseNum; i++) {
            //입력값 받기
            arrLength = Integer.parseInt(br.readLine());
            int[][] arr = new int[arrLength][arrLength];

            for(int j=0; j<arrLength; j++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                for(int k=0; k<arrLength; k++) {
                    arr[j][k] = Integer.parseInt(st.nextToken());
                }
            }


            int[][] arr_90 = Rotation(arr);
            int[][] arr_180 = Rotation(arr_90);
            int[][] arr_270 = Rotation(arr_180);

			//결과 출력
            System.out.println("#"+i);
            for(int j=0; j<arrLength; j++) {
                for(int k=0; k<arrLength; k++) {
                    System.out.print(arr_90[j][k]);
                }
                System.out.print(" ");

                for(int k=0; k<arrLength; k++) {
                    System.out.print(arr_180[j][k]);
                }
                System.out.print(" ");

                for(int k=0; k<arrLength; k++) {
                    System.out.print(arr_270[j][k]);
                }
                System.out.println();
            }
        }
    }

	//90도 회전 함수
    public static int[][] Rotation(int[][] arr) {
        int[][] result = new int[arrLength][arrLength];

        for(int j=0; j<arrLength; j++) {
            for(int k=0; k<arrLength; k++) {
                result[j][k] = arr[arrLength-1-k][j];
            }
        }

        return result;
    }
}


   
profile
그날의 기록

0개의 댓글