행렬을 정해진 조건으로 회전 후 범위 내에 최소값을 담은 배열을 리턴합니다
int rows = 6;
int columns = 6;
int[][] queries = {{2,2,5,4},{3,3,6,6},{5,1,6,3}};
가로,세로 [2칸,2칸]에서 가로,세로 [5칸,4칸]까지의 범위에서 테두리 회전 했을 때, 최소값은 8
가로,세로 [3칸,3칸]에서 가로,세로[6칸,6칸] 까지의 범위에서 테두리 회전 했을 때, 최소값은 10
가로,세로 [5칸,1칸]에서 가로,세로[6칸,3칸] 까지의 범위에서 테두리 회전 했을 때, 최소값은 25
최소값 배열을 리턴합니다.
return {8,10,25}
코드 작성시엔 인덱스값을 기준으로 회전 해야하기에 값에 접근할때 -1합니다.
package PG_Lv_2.행렬테두리회전_009;
public class Solution
{
int[][] matrix;
public int[] solution(int rows, int columns, int[][] queries)
{
this.matrix = new int[rows][columns]; // 행렬 생성
int[] answer = new int[queries.length]; // 정답 배열
for (int i = 0; i < rows; i++)
{ // 행렬 초기화
for (int j = 0; j < columns; j++)
{
matrix[i][j] = i * columns + j + 1;
}
}
for (int i = 0; i < queries.length; i++)
{ // 회전하고 최솟값 answer에 저장
answer[i] = rotate(queries[i]);
}
return answer;
}
public int rotate(int[] query)
{
// 인덱스 값을 기준으로 회전 해야 하기 떄문에 -1
int r1 = query[0] - 1; // 가로
int c1 = query[1] - 1; // 세로
int r2 = query[2] - 1;
int c2 = query[3] - 1;
int temp = this.matrix[r1][c1]; // 시작위치 값 임시저장
int min = temp; // min값 초기화
for (int i = r1; i < r2; i++)
{ // 왼쪽 회전
this.matrix[i][c1] = this.matrix[i + 1][c1];
if (min > this.matrix[i][c1])
min = this.matrix[i][c1];
}
for (int i = c1; i < c2; i++)
{ // 아래 회전
this.matrix[r2][i] = this.matrix[r2][i + 1];
if (min > this.matrix[r2][i])
min = this.matrix[r2][i];
}
for (int i = r2; i > r1; i--)
{ // 오른쪽 회전
this.matrix[i][c2] = this.matrix[i - 1][c2];
if (min > this.matrix[i][c2])
min = this.matrix[i][c2];
}
for (int i = c2; i > c1; i--)
{ // 위 회전
this.matrix[r1][i] = this.matrix[r1][i - 1];
if (min > this.matrix[r1][i])
min = this.matrix[r1][i];
}
this.matrix[r1][c1 + 1] = temp; // 임시저장한 값 저장
return min; // 해당 회전에서의 최소값을 리턴
}
}