코딩테스트/SWEA

[SWEA] (D2) 1961. 숫자 배열 회전

l0o0lv 2024. 10. 31. 21:48

N x N 행렬이 주어질 때,

 

시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.

 

[제약 사항]

N은 3 이상 7 이하이다.

 

[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

 

각 테스트 케이스의 첫 번째 줄에 N이 주어지고,

 

다음 N 줄에는 N x N 행렬이 주어진다.

 

[출력]

출력의 첫 줄은 '#t'로 시작하고,

 

다음 N줄에 걸쳐서 90도, 180도, 270도 회전한 모양을 출력한다.

 

입력과는 달리 출력에서는 회전한 모양 사이에만 공백이 존재함에 유의하라.

 

(t 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

[풀이]

아래 예제에서 90도, 180도, 270도 회전한 배열의 결괏값이다.

 

여기서 규칙을 한가지 볼 수 있다.

 

회전을 할 때, 기존 배열의 2,0부터 0,0까지의 값을 회전할 배열의 첫 번째 줄에 넣으면 된다.

 

두 번째 줄은 2,1 그리고 세 번째 줄은 2,2 부터 시작해 행을 하나씩 줄여준다.

 

이걸 반복하고 출력해주면 된다.

 

풀고 나서 보니 회전하는 코드는 따로 메소드를 분리시켜 사용하면 중복성을 줄일 수 있을 것 같다.

 

import java.util.*;
import java.lang.*;
import java.io.*;
 
class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int testCase = Integer.parseInt(br.readLine());
        StringTokenizer st;
 
        for(int i = 1 ; i <= testCase ; i++){
            System.out.println("#" + i);
 
            int arrSize = Integer.parseInt(br.readLine());
            int[][] arr = new int[arrSize][arrSize];
            int[][] onceRotate = new int[arrSize][arrSize];
            int[][] secondRotate = new int[arrSize][arrSize];
            int[][] thirdRotate = new int[arrSize][arrSize];
             
            for(int j = 0 ; j < arrSize ; j++){
                st = new StringTokenizer(br.readLine());
                for(int k = 0 ; k < arrSize ; k++){
                    arr[j][k] = Integer.parseInt(st.nextToken());
                }
            }
 
            for(int j = 0 ; j < arrSize ; j++){
                int rotateIndex = arrSize - 1;
                for(int k = 0 ; k < arrSize ; k++){
                    onceRotate[j][k] = arr[rotateIndex][j];
                    rotateIndex--;
                }
            }
 
            for(int j = 0 ; j < arrSize ; j++){
                int rotateIndex = arrSize - 1;
                for(int k = 0 ; k < arrSize ; k++){
                    secondRotate[j][k] = onceRotate[rotateIndex][j];
                    rotateIndex--;
                }
            }
 
            for(int j = 0 ; j < arrSize ; j++){
                int rotateIndex = arrSize - 1;
                for(int k = 0 ; k < arrSize ; k++){
                    thirdRotate[j][k] = secondRotate[rotateIndex][j];
                    rotateIndex--;
                }
            }
 
            for(int j = 0 ; j < arrSize ; j++){
                for(int k = 0 ; k < arrSize ; k++){
                    System.out.print(onceRotate[j][k]);
                }
                System.out.print(" ");
                for(int k = 0 ; k < arrSize ; k++){
                    System.out.print(secondRotate[j][k]);
                }
                System.out.print(" ");
                for(int k = 0 ; k < arrSize ; k++){
                    System.out.print(thirdRotate[j][k]);
                }
                System.out.println("");
            }
             
        }
    }
}

 

문제 출처 : https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5Pq-OKAVYDFAUq&categoryId=AV5Pq-OKAVYDFAUq&categoryType=CODE&problemTitle=&orderBy=PASS_RATE&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com