문제 설명
아래 그림은 6 x 6 행렬
x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.
문제 풀이
문제를 분석해 본 결과 특정한 알고리즘을 쓰는 것이 아닌 구현 문제로 판단하여
4개의 for loop를 구현해서 한칸씩 옮기는 방법으로 접근
단, 한칸씩 옮기게 되면 마지막 값이 누락되게 때문에 처음 값을 temp에 넣고 마지막 값에 temp을 할당해주는 방법으로 구현
let arr = [];
function solution(rows, columns, queries) {
let answer = [];
let num = 1;
for(let i = 0; i < rows; i++){
arr[i] = [];
for(let j = 0; j < columns; j++){
arr[i][j] = num;
num++;
}
}
for(let i = 0; i < queries.length; i++){
let r1 = queries[i][0]-1;
let c1 = queries[i][1]-1;
let r2 = queries[i][2]-1;
let c2 = queries[i][3]-1;
answer.push (rotation(r1,c1,r2,c2)) ;
}
return answer;
}
function rotation(r1,c1,r2,c2){
//최소 값을 찾기 위해 또 다른 value배열을 생성
let value =[];
// 처음 값을 temp에 할당
let temp = arr[r1][c1];
value.push(arr[r1][c1]);
// 반시게 방향으로 한칸씩 밀어서 재배치
for(let i = r1; i < r2; i++){
arr[i][c1] = arr[i+1][c1];
value.push(arr[i][c1]);
}
for(let i = c1; i < c2; i++){
arr[r2][i] = arr[r2][i+1];
value.push(arr[r2][i]);
}
for(let i = r2; i > r1; i--){
arr[i][c2] = arr[i-1][c2];
value.push(arr[i][c2]);
}
for(let i = c2; i > c1+1; i--){
arr[r1][i] = arr[r1][i-1];
value.push(arr[r1][i]);
}
// 마지막 값에 tmep를 할당
arr[r1][c1+1] = temp;
// rows와 columns의 최대값이 각각 100이기 때문에 나올수 있는 최소값으 10000
let min = 10001;
// value에 할당 되어 있는 값들의 전체를 비교하여 최소값을 찾는다.
for(let i = 0; i < value.length; i++){
if(min > value[i]){
min = value[i];
}
}
return min;
}
처음 구현할때 r1,c1,r2,c2와 같은 변수를 따로 선언하지 않아 헷갈리는 부분도 많고 가독성도 떨어져서 문법 오류가 많이 나서 변수를 선언하였더니 오류가 더 잘 잡혔다. 특정 값이 고정되어 있을 경우에서 무조건적으로 변수 선언을 해야겠다고 생각하였다.