[SW Expert Academy] 1961. 숫자 배열 회전(D2)

김상욱·2024년 6월 25일

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-OKAVYDFAUq&categoryId=AV5Pq-OKAVYDFAUq&categoryType=CODE&problemTitle=%EC%88%AB%EC%9E%90+%EB%B0%B0%EC%97%B4&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

JAVA 풀이

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        int tc=s.nextInt();
        for(int i=1;i<=tc;i++){
            System.out.println("#"+i);
            int n=s.nextInt();
            int[][] board=new int[n][n];
            for(int j=0;j<n;j++){
                for(int t=0;t<n;t++){
                    board[j][t]=s.nextInt();
                }
            }
            String[] strs=new String[n];
            for(int j=0;j<n;j++){
                strs[j]="";
            }
            for(int j=0;j<3;j++){
                board=rotate(board,n);

                for(int k=0;k<n;k++){
                    for(int t=0;t<n;t++){
                        strs[k]+=Integer.toString(board[k][t]);
                    }
                    strs[k]+=" ";
                }
            }
            for(int j=0;j<n;j++){
                System.out.println(strs[j]);
            }
        }
    }
    
    public static int[][] rotate(int[][] arr,int n){
        int[][] new_board=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                new_board[j][n-i-1]=arr[i][j];
            }
        }
        return new_board;
    }
}

내 생각

  • 각 케이스 별로 for문으로 돌리면서 2차원 배열을 생성해 입력받는다. 그 후, 출력을 받기 위해 String 배열을 만들어서 null 값이 들어가지 않도록 빈 문자열로 초기화 해준 후, rotate 함수를 통해 각 90도 180도 270도 결과를 얻기 위해 회전시키면서 변화된 값을 저장해준다. rotate 함수의 경우에는 x,y의 좌표점을 기준으로 회전시켰을 때, 변화과정을 보면 되는데 x=y축으로 한번 대칭하고 y축을 기준으로 또한번 대칭하기 때문에 (x,y)->(n-1-x)의 결과값이 나온다.
  • 그 후 문자열을 행에 따라 담아 출력해주면 된다.
  • 풀이 시간 : 25분

Python 풀이

def rotate(arr):
    new_arr=[[0]*len(arr) for _ in range(len(arr))]
    for i in range(n):
        for j in range(n):
            new_arr[j][len(arr)-i-1]=arr[i][j]
    return new_arr
    
for tc in range(int(input())):
    print("#"+str(tc+1))
    n=int(input())
    arr=[]
    for _ in range(n):
        arr.append(list(map(int,input().split())))
    answer=[""]*n
    for _ in range(3):
        arr=rotate(arr)
        
        for i in range(n):
            for j in range(n):
                answer[i]+=str(arr[i][j])
            answer[i]+=' '
    for i in range(n):
        print(answer[i])

내 생각

  • 먼저 2차원 배열을 회전시키는 함수를 작성하면 된다. 각 변의 길이를 기준 삼아서 그림을 그려서 시계방향으로 'L'모양을 돌려보면 된다. 시계방향으로 회전시킨 모양은 y=x축으로 한번 뒤집고, 또한번 y축을 기준으로 뒤집어진 모양이 되기 때문에 각 뒤집어진 변수를 기준삼아서 새롭게 2차원 배열을 그려준다.
  • 출력의 경우 각 행이 옆으로 나열된 형태이기 때문에 행별로 저장할 배열을 하나 두고 문자를 더해주는 식으로 저장한 다음 최종적으로 한번 더 출력해 주었다.
  • 풀이 시간 : 20분

0개의 댓글