かいてんマトリクスきょうかい
しょかい
マトリクスを初期化する方法に従ってマトリクス()queryを埋め込み、回転マトリクスの方法回転()を宣言します.
このときrotate()では、回転ごとに移動するすべての数値にアクセスできるので、最高値を返します.
rotate()では、1つの数字を移動するたびに、現在位置の数字をQueueに含め、Queueの一番前の数字に変換します.import java.util.*;
class Solution {
int[][] board;
Queue<Integer> queue;
public int[] solution(int rows, int columns, int[][] queries) {
board = new int[rows][columns];
queue = new LinkedList<>();
fillMatrix(rows, columns);
//각 회전 당, 이동한 숫자들 중 최솟값 담을 배열
int[] answer = new int[queries.length];
for(int i=0; i<answer.length; i++) {
answer[i] = rotate(queries[i]);
}//for end
return answer;
}//solution() end
//행렬 값 채우는 메소드
public void fillMatrix(int rows, int columns) {
int n = 0;
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) {
board[i][j] = ++n;
}
}
}
//query 범위의 행렬 테두리 회전하고, 최솟값 리턴하는 메소드
public int rotate(int[] query) {
//queue 비우기
queue.clear();
int x1 = query[0]-1;
int y1 = query[1]-1;
int x2 = query[2]-1;
int y2 = query[3]-1;
int min = board[x1][y1];
queue.add(board[x1][y1]);
//위 테두리
for(int i=1; i<=y2-y1; i++) {
min = Math.min(min, board[x1][y1+i]);
queue.add(board[x1][y1+i]);
board[x1][y1+i] = queue.poll();
}//for end
//오른쪽 테두리
for(int i=1; i<=x2-x1; i++) {
min = Math.min(min, board[x1+i][y2]);
queue.add(board[x1+i][y2]);
board[x1+i][y2] = queue.poll();
}//for end
//아래 테두리
for(int i=1; i<=y2-y1; i++) {
min = Math.min(min, board[x2][y2-i]);
queue.add(board[x2][y2-i]);
board[x2][y2-i] = queue.poll();
}//for end
//왼쪽 테두리
for(int i=1; i<=x2-x1; i++) {
min = Math.min(min, board[x2-i][y1]);
queue.add(board[x2-i][y1]);
board[x2-i][y1] = queue.poll();
}//for
return min;
}
}
改善された回答
テストの時間は思ったより長いです.
数字を1つずつ移動していくことを考えていると、終わりの場所から考えると並ばなくてもいいと思います.
開始点[x 1][y 1]の数字を一時的に記憶し、左枠から1つずつ移動する.(時計回りに回転)
移動後、[x 1][y 1+1]の位置に一時保存した値を入れます.public int rotate(int[] query) {
int x1 = query[0]-1;
int y1 = query[1]-1;
int x2 = query[2]-1;
int y2 = query[3]-1;
//시작지점 값 임시저장
int temp = board[x1][y1];
int min = board[x1][y1];
//왼쪽 테두리
for(int i=x1; i<x2; i++) {
min = Math.min(min, board[i][y1]);
board[i][y1] = board[i+1][y1];
}//for end
//아래 테두리
for(int i=y1; i<y2; i++) {
min = Math.min(min, board[x2][i]);
board[x2][i] = board[x2][i+1];
}//for end
//오른쪽 테두리
for(int i=x2; i>x1; i--) {
min = Math.min(min, board[i][y2]);
board[i][y2] = board[i-1][y2];
}//for end
//아래 테두리
for(int i=y2; i>y1; i--) {
min = Math.min(min, board[x1][i]);
board[x1][i] = board[x1][i-1];
}//for end
board[x1][y1+1] = temp;
return min;
}//rotate2() end
時間がずいぶん短縮された.
Reference
この問題について(かいてんマトリクスきょうかい), 我々は、より多くの情報をここで見つけました
https://velog.io/@nelljun/행렬-테두리-회전하기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import java.util.*;
class Solution {
int[][] board;
Queue<Integer> queue;
public int[] solution(int rows, int columns, int[][] queries) {
board = new int[rows][columns];
queue = new LinkedList<>();
fillMatrix(rows, columns);
//각 회전 당, 이동한 숫자들 중 최솟값 담을 배열
int[] answer = new int[queries.length];
for(int i=0; i<answer.length; i++) {
answer[i] = rotate(queries[i]);
}//for end
return answer;
}//solution() end
//행렬 값 채우는 메소드
public void fillMatrix(int rows, int columns) {
int n = 0;
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) {
board[i][j] = ++n;
}
}
}
//query 범위의 행렬 테두리 회전하고, 최솟값 리턴하는 메소드
public int rotate(int[] query) {
//queue 비우기
queue.clear();
int x1 = query[0]-1;
int y1 = query[1]-1;
int x2 = query[2]-1;
int y2 = query[3]-1;
int min = board[x1][y1];
queue.add(board[x1][y1]);
//위 테두리
for(int i=1; i<=y2-y1; i++) {
min = Math.min(min, board[x1][y1+i]);
queue.add(board[x1][y1+i]);
board[x1][y1+i] = queue.poll();
}//for end
//오른쪽 테두리
for(int i=1; i<=x2-x1; i++) {
min = Math.min(min, board[x1+i][y2]);
queue.add(board[x1+i][y2]);
board[x1+i][y2] = queue.poll();
}//for end
//아래 테두리
for(int i=1; i<=y2-y1; i++) {
min = Math.min(min, board[x2][y2-i]);
queue.add(board[x2][y2-i]);
board[x2][y2-i] = queue.poll();
}//for end
//왼쪽 테두리
for(int i=1; i<=x2-x1; i++) {
min = Math.min(min, board[x2-i][y1]);
queue.add(board[x2-i][y1]);
board[x2-i][y1] = queue.poll();
}//for
return min;
}
}
テストの時間は思ったより長いです.
数字を1つずつ移動していくことを考えていると、終わりの場所から考えると並ばなくてもいいと思います.
開始点[x 1][y 1]の数字を一時的に記憶し、左枠から1つずつ移動する.(時計回りに回転)
移動後、[x 1][y 1+1]の位置に一時保存した値を入れます.
public int rotate(int[] query) {
int x1 = query[0]-1;
int y1 = query[1]-1;
int x2 = query[2]-1;
int y2 = query[3]-1;
//시작지점 값 임시저장
int temp = board[x1][y1];
int min = board[x1][y1];
//왼쪽 테두리
for(int i=x1; i<x2; i++) {
min = Math.min(min, board[i][y1]);
board[i][y1] = board[i+1][y1];
}//for end
//아래 테두리
for(int i=y1; i<y2; i++) {
min = Math.min(min, board[x2][i]);
board[x2][i] = board[x2][i+1];
}//for end
//오른쪽 테두리
for(int i=x2; i>x1; i--) {
min = Math.min(min, board[i][y2]);
board[i][y2] = board[i-1][y2];
}//for end
//아래 테두리
for(int i=y2; i>y1; i--) {
min = Math.min(min, board[x1][i]);
board[x1][i] = board[x1][i-1];
}//for end
board[x1][y1+1] = temp;
return min;
}//rotate2() end
時間がずいぶん短縮された.
Reference
この問題について(かいてんマトリクスきょうかい), 我々は、より多くの情報をここで見つけました https://velog.io/@nelljun/행렬-테두리-회전하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol