문제 링크: https://programmers.co.kr/learn/courses/30/lessons/77485#
우선, 이 문제는 걍 구현 문제다.
회전해야하는 범위가 [2, 2, 5, 5]
라고 가정하면, 아래의 그림처럼 구역을 나누고 회전을 진행한다.
순서대로 cnt=1
일 때는 오른쪽으로 한칸씩, cnt=2
일 때는 아래로 한칸씩~~~
알고리즘이 뭐 어렵다는 아니고 현재값과 다음값을 잘 저장해서 최소값 찾고 값 밀어넣고만 잘하면 되는 문제였다.
import java.util.List;
import java.util.ArrayList;
import java.util.stream.*;
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[][] board = new int[rows + 1][columns + 1];
int num = 1;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= columns; j++) {
board[i][j] = num++;
}
}
List<Integer> minValues = new ArrayList<>();
for (int[] query : queries) {
int minRow = query[0];
int maxRow = query[2];
int minCol = query[1];
int maxCol = query[3];
int i = minRow;
int j = minCol;
int curVal = board[i][j];
int nextVal;
int minVal = 1000000;
for (int cnt = 1; cnt <= 4; cnt++) {
if (cnt == 1) {
while (j < maxCol) {
minVal = Math.min(minVal, curVal);
nextVal = board[i][j + 1];
board[i][j + 1] = curVal;
curVal = nextVal;
j++;
}
} else if (cnt == 2) {
while (i < maxRow) {
minVal = Math.min(minVal, curVal);
nextVal = board[i + 1][j];
board[i + 1][j] = curVal;
curVal = nextVal;
i++;
}
} else if (cnt == 3) {
while (j > minCol) {
minVal = Math.min(minVal, curVal);
nextVal = board[i][j - 1];
board[i][j - 1] = curVal;
curVal = nextVal;
j--;
}
} else {
while (i > minRow) {
minVal = Math.min(minVal, curVal);
nextVal = board[i - 1][j];
board[i - 1][j] = curVal;
curVal = nextVal;
i--;
}
}
}
minValues.add(minVal);
}
return minValues.stream().mapToInt(i1 -> i1).toArray();
}
}