단순 구현문제 입니다.
행렬과 회전 좌표가 주어졌을 때, 회전할 때 마다 회전 하는 값들의 최소를 구하는 문제입니다.
단, 회전 할 때 테두리들의 값만 회전하고 중앙의 값은 회전하지 않습니다.
제가 구현한 방법은 간단합니다.
위 그림과 같이 3*3 행렬이 있다고 하겠습니다.
우선, 그림과 같이 테두리 끝부분에 있는 네 개의 값을 저장합니다.
저장을 하는 이유는, 회전할 때 값이 해당 위치에 덮어지기 때문입니다.
회전을 하고, 각 위치에 맞게 저장한 값을 넣으면 됩니다.
matrix[r1+1][c2] = t1;
matrix[r2][c2-1] = t2;
matrix[r2-1][c1] = t3;
matrix[r1][c1+1] = t4;
[구현 코드]
class Solution {
private static int[][] matrix;
public static int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
matrix = new int[rows + 1][columns + 1];
for (int i = 1; i < rows + 1; i++) {
for (int j = 1; j < columns + 1; j++) {
matrix[i][j] = (i - 1) * columns + j;
}
}
for (int i = 0; i < queries.length; i++) {
int[] query = queries[i];
answer[i] = rotate(query[0], query[1], query[2], query[3]);
}
return answer;
}
private static int rotate(int r1, int c1, int r2, int c2) {
int min = Integer.MAX_VALUE;
int t1, t2, t3, t4;
// 1
t1 = matrix[r1][c2];
for(int i = c2; i>c1; i--){
matrix[r1][i] = matrix[r1][i-1];
min = Math.min(min, matrix[r1][i]);
}
// 2
t2 = matrix[r2][c2];
for(int i=r2; i>r1; i--){
matrix[i][c2] = matrix[i-1][c2];
min = Math.min(min, matrix[i][c2]);
}
// 3
t3 = matrix[r2][c1];
for(int i=c1; i<c2; i++){
matrix[r2][i] = matrix[r2][i+1];
min = Math.min(min, matrix[r2][i]);
}
// 4
t4 = matrix[r1][c1];
for(int i=r1; i<r2; i++){
matrix[i][c1] = matrix[i+1][c1];
min = Math.min(min, matrix[i][c1]);
}
matrix[r1+1][c2] = t1;
matrix[r2][c2-1] = t2;
matrix[r2-1][c1] = t3;
matrix[r1][c1+1] = t4;
// 값이 덮어졌으므로, 비교가 되지 않았음
min = Math.min(min, t1);
min = Math.min(min, t2);
min = Math.min(min, t3);
min = Math.min(min, t4);
return min;
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 - 거리두기 확인하기(Java) (0) | 2022.10.03 |
---|---|
프로그래머스 - 다단계 칫솔 판매(Java) (0) | 2022.10.02 |
프로그래머스 - 로또의 최고 순위와 최저 순위(Java) (0) | 2022.10.02 |
프로그래머스 - 길 찾기 게임(Java) (0) | 2022.09.30 |
백준 - 11559 Puyo Puyo(Java) (0) | 2022.09.27 |