(1:00)
먼저, 회전의 수(쿼리의 개수 ) 는 최대 1만개
행,열은 최대 100이다.
→ 하나의 횐전당 이동의 개수는 최대 약, 400개 * 회전의수(최대 1만개)
→ 400만
즉, 브루트 포스로 풀어도 괜찮다.
생각을 잘못하는 바람에
시간이 엄청 많이 걸려버렸다. 계속 덮어쓰기를 하고 있었다.
class Solution {
// 아직 초기화 안함
public int[][] board;
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
board = new int[rows][columns];
init();
int idx = 0;
for(int[] q: queries){
answer[idx++] = rotate(q[0]-1,q[1]-1,q[2]-1,q[3]-1);
}
return answer;
}
public void init(){
int cnt = 1;
for(int r = 0 ; r < board.length;r++){
for(int c = 0; c< board[0].length; c++){
board[r][c] = cnt++;
}
}
}
public int rotate(int x1,int y1,int x2, int y2){
int min = board[x1][y1];
int temp1 = board[x1][y1] ,temp2 = temp1;
// -> 이동
for(int y = y1+1; y <= y2; y++){
temp2 = board[x1][y];
board[x1][y] = temp1;
temp1 = temp2;
min = Math.min(min,temp1);
}
// temp1 에는, [x1][y2]가 들어가 있다.
for(int x = x1+1; x <= x2 ;x++){
temp2 = board[x][y2];
board[x][y2] = temp1;
temp1 = temp2;
min = Math.min(min,temp1);
}
// temp1 에는 board[x2][y2]가 들어가 있다.
// <- 이동
for(int y = y2-1 ; y >= y1; y--){
temp2 = board[x2][y];
board[x2][y] = temp1;
temp1 = temp2;
min = Math.min(min,temp1);
}
// temp1 에는 board[x2][y1]이 들어가 있다
for(int x = x2 -1 ; x >= x1 ;x--){
temp2 = board[x][y1];
board[x][y1] = temp1;
temp1 = temp2;
min = Math.min(min,temp1);
}
return min;
}
}