🕐 풀이시간 : 1시간 이상
할 게 많아서 좀 복잡했다.
90도 돌린 배열에 값을 기록해두면서 배열 자체도 뒤짚는 과정을 계속해야했는데
내가 다른 풀이들과 접근방법이 많이 달랐다.
//1.회전하고 값 넣기
int sum = 0;
int idx= 0;
for(int i = 0; i < size; i++){
for(int j = size-1; j >= 0; j--){
sum += board[j][i] * (10*j);
temp[i][Math.abs(j -size)] = board[j][i];
}
sum += board[0][i];
newBoard[idx][cycle] = sum;
idx++;
}
나는 배열을 세로로 계산해나가며 해당 번째 인덱스에 맞게 곱셈 연산은 하여 주려고 했다.
예를 들어
1 2 3 741
4 5 6 ->
7 8 9
741을 구하기 위해서는 700 + 40 +1 로 생각을 하고 풀었는데 다른 풀이들은 그냥 회전을 하고나서 출력을 해주는 형식으로 풀었다. 당연하게 이런 식으로 풀려고 했는데 뭔가 띵했다.
7 4 1
8 5 2
9 6 3
이렇게 뒤짚힌 숫자를 3개 가지고 그 3개를 이용해서 출력하는 것이 가장 적절한 풀이이다!
어떻게 푸는 지 느낌을 보고 한 번 풀어보려고 했는데 잘 안되었다.
회전을 한다는 것을 구현하는 것은 주석으로 하나씩 적어보면서 식을 구했는데(이것도 인덱스 실수로 한 번 크게 잘못 구함) 돌리고 출력하는 과정까지 머리가 막 꼬인다.
이런 류의 문제들에 스스로가 약함을 다시 한 번 느끼고 이런 문제들은 다시 한 번 풀어봐야한다.
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T =sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
System.out.println("#" + test_case);
int size = sc.nextInt();
int[][] board = new int[size][size];
//입력받기
for(int i = 0; i < size; i++){
for(int j = 0 ; j < size; j++){
board[i][j] = sc.nextInt();
}
}
//회전한 값들 구하기
int[][] board90 = Rotation90(board);
int[][] board180 = Rotation90(board90);
int[][] board270 = Rotation90(board180);
for(int j=0; j<size; j++) {
for(int k=0; k<size; k++) {
System.out.print(board90[j][k]);
}
System.out.print(" ");
for(int k=0; k<size; k++) {
System.out.print(board180[j][k]);
}
System.out.print(" ");
for(int k=0; k<size; k++) {
System.out.print(board270[j][k]);
}
System.out.println();
}
}
}
public static int[][] Rotation90(int[][] board){
int[][] returnBoard = new int[board[0].length][board.length];
for(int i = 0; i < board.length; i++){
for(int j = 0 ; j < board.length; j++){
returnBoard[i][j] = board[board.length-1-j][i];
}
}
return returnBoard;
}
}