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