문제
코드
function solution(rows, columns, queries) {
const ans = [];
const arr = []
for(let i=0; i<rows; i++) {
const rowArr = [];
for(let j=0; j<columns; j++) {
rowArr.push(rows*i+j+1)
}
arr.push(rowArr);
}
console.log(arr);
for(let curArr of queries) {
const maxCol = curArr[3] - 1,
maxRow = curArr[2] - 1,
minRow = curArr[0] - 1,
minCol = curArr[1] - 1,
len = ((maxRow-minRow) + (maxCol-minCol))*2;
let curCol = minCol, curRow = minRow, next = arr[curRow][curCol], dir = 'R'
const roopNum = [next];
for(let i=0; i<len; i++) {
const target = next
switch(dir) {
case 'R':
next = arr[curRow][++curCol];
arr[curRow][curCol] = target;
if(curCol === maxCol) dir = 'D'
break;
case 'D':
next = arr[++curRow][curCol];
arr[curRow][curCol] = target;
if(curRow === maxRow) dir = 'L'
break;
case 'L':
next = arr[curRow][--curCol];
arr[curRow][curCol] = target;
if(curCol === minCol) dir = 'U'
break;
case 'U':
next = arr[--curRow][curCol];
arr[curRow][curCol] = target;
if(curRow === minRow) dir = 'R'
break;
}
roopNum.push(next);
}
ans.push(Math.min(...roopNum))
}
return ans;
}
function solution(rows, columns, queries) {
const a = [...Array(rows)].map((_, r)=>[...Array(columns)].map((_, c)=>r*columns+c+1));
const mins = [];
queries.map(query => {
const [x1, y1, x2, y2] = query.map(_=>_-1);
let min = a[x1][y1], tmp = a[x1][y1];
for(let i=x1;i<x2;i++) {
a[i][y1] = a[i+1][y1];
min = Math.min(min, a[i][y1]);
}
for(let i=y1;i<y2;i++) {
a[x2][i] = a[x2][i+1];
min = Math.min(min, a[x2][i]);
}
for(let i=x2;i>x1;i--) {
a[i][y2] = a[i-1][y2];
min = Math.min(min, a[i][y2]);
}
for(let i=y2;i>y1;i--) {
a[x1][i] = a[x1][i-1];
min = Math.min(min, a[x1][i]);
}
a[x1][y1+1] = tmp;
mins.push(min);
})
return mins;
}
switch를 이용한 풀이
- 행렬의 회전이나 이동은 항상 switch를 이용해 풀었어요!
- 방향과 첫 값을 저장해주고, min 혹은 max에 닿으면 방향을 바꿔줘요.
- 선언이 많고, 비슷한 동작을 반복하는 코드라 지저분해요ㅎㅎㅎ
테두리만 도니까 for를 4번 돌아!
- 더 빠른 풀이는 어차피 테두리만 도니까 min max 값 정해두고, 각 변을 한 번씩 총 4번을 돌아요.
- 시간이 훨씬 빠르다..