https://programmers.co.kr/learn/courses/30/lessons/77485
구현, 행렬
가로행
세로열
가로와 세로를 헷갈리면 안된다.
행렬인 경우 x,y라면 x행(가로)에 y열(세로)
3행이면 3번째 가로행이고, 2열이면 2번쨰 세로열이다.
[예제 구현]
1. 맨 처음에 값을 임시값으로 저장시켜준다.
2. 시작행부터 끝 행까지 현재 값을 다음 행 값으로 채운다.
3. 시작 세로열부터 끝 세로열까지 현재 값을 다음 세로열 값으로 채운다.
4. 끝 가로행부터 시작 가로행까지 현재 값을 이전 가로행 값으로 채운다.
5. 끝 세로열부터 시작 세로열까지 현재 값을 이전 세로열 값으로 채운다.
6. 2번에서 5번을 수행하면서 최소값을 계속 저장해준다.
6. 마지막으로 시작 값을 다음 세로열 값으로 넣어준다.
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int number = 1;
int[][] grid = new int[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
grid[i][j] = number++;
}
}
for (int i = 0; i < queries.length; i++) {
answer[i] = rotation(queries[i], grid);
}
return answer;
}
private int rotation(int[] query, int[][] grid) {
int r1 = query[0] - 1;
int c1 = query[1] - 1;
int r2 = query[2] - 1;
int c2 = query[3] - 1;
// 시작위치 값 임시저장
int temp = grid[r1][c1];
// min값 초기화
int min = temp;
// 왼쪽에서 오른쪽
for (int i = r1; i < r2; i++) {
grid[i][c1] = grid[i + 1][c1];
min = Math.min(min, grid[i][c1]);
}
// 오른쪽에서 밑으로
for (int i = c1; i < c2; i++) {
grid[r2][i] = grid[r2][i + 1];
min = Math.min(min, grid[r2][i]);
}
// 밑에서 왼쪽으로
for (int i = r2; i > r1; i--) {
grid[i][c2] = grid[i - 1][c2];
min = Math.min(min, grid[i][c2]);
}
// 밑에서 왼쪽 위로
for (int i = c2; i > c1; i--) { // 회전의 4번
grid[r1][i] = grid[r1][i - 1];
min = Math.min(min, grid[r1][i]);
}
// 원래 값을 한칸 오른쪽으로 이동
grid[r1][c1 + 1] = temp;
return min;
}
}