https://programmers.co.kr/learn/courses/30/lessons/77485
function solution(rows, columns, queries) {
let map = [];
makeMap(map, rows, columns);
// console.log(map);
var answer = [];
for (let t=0; t < queries.length; t++) {
const [x1, y1, x2, y2] = queries[t];
// console.log(x1, y1, x2, y2);
const stack = [];
// 윗변 우로 +1
for (let i = y1; i < y2; i++) stack.push(map[x1][i]);
// 우변 아래로 +1
for (let i = x1; i < x2; i++) stack.push(map[i][y2]);
// 아래변 좌로 -1
for (let i = y2; i > y1; i--) stack.push(map[x2][i]);
// 좌변 위로 -1
for (let i = x2; i > x1; i--) stack.push(map[i][y1]);
// 정답 찾기
answer.push(Math.min(...stack));
// 가장 마지막에 한거 앞으로 보내기.
stack.unshift(stack.pop());
changeMap(map, [x1, y1, x2, y2], stack);
}
return answer;
}
function makeMap(map, rows, columns) {
let num = 1;
for (let i = 0; i <= rows; i++) {
map[i] = [0, ];
for (let j = 0; j < columns; j++) {
if (i == 0) {
map[i].push(0);
} else {
map[i].push(num);
num++;
}
}
}
}
function changeMap(map, [x1, y1, x2, y2], stack) {
for (let i = y1; i < y2; i++) map[x1][i] = stack.shift();
for (let i = x1; i < x2; i++) map[i][y2] = stack.shift();
for (let i = y2; i > y1; i--) map[x2][i] = stack.shift();
for (let i = x2; i > x1; i--) map[i][y1] = stack.shift();
}
let rows = 6;
let columns = 6;
let queries = [[2, 2, 5, 4], [3, 3, 6, 6], [5, 1, 6, 3]];
console.log(solution(rows, columns, queries));
처음에 돌릴부분의 최소값을 찾는 문제라 그냥 해당영역의 map에서 최소값만 구하면 되겠다 생각하고, 간단하다 생각했는데 그게 아니였다.
다음 쿼리에서는 처음 쿼리에서 변경된 값을 유지한상태에서 새로운 범위에서 숫자를 또 찾아야한다.
그래서 map을 이동 시키는 방법에 대해서 고민하다가 이부분을 해결하지 못해 다른사람의 코드를 보았다.
해결 방법은 stack을 이용한 방법이다.
먼저, map을 만드는데 queries의 2,2가 1부터 새는거라 map의 길이를 한 줄 더길게 해줘야했다.
6*6의 경우 목표 map
0 0 0 0 0 0 0
0 1 2 3 4 5 6
0 7 8 9 10 11 12
0 13 14 15 16 17 18
0 19 20 21 22 23 24
0 25 26 27 28 29 30
0 31 32 33 34 35 36
그 다음 윗변 부터 시계방향으로 해당하는 값들을 stack에 넣어준다.
(나는 다른 값을 넣을 때 기존 값에서 값을 더하거나 해서 map을 변경시켜야 겠다 생각하고, 한번에 map까지 바꾸는걸 생각해서 더 어려웠었던거 같다.)
최소값을 찾아 answer에 넣어두고, 담겨있는 stack을 출력해보면 처음 들어갈 값이 가장 마지막에 있는걸 볼 수 있다. 이 부분을 제일 앞으로 이동시켜주고 map을 변경시켜준다.
하나씩 shift해서 하나씩 값을 넣어준다.