숫자를 가진 행렬을 2차원 배열을 이용해, 특정한 규칙으로 구현하는 문제이다.
사실 내가 어려워하는 유형인데, 우선 세부적인 내용을 구현해야 하기 때문에, 시간이 소모되고, 특히 2차원 배열이 난 좀 헷갈린다.
난 이 문제를 다음과 같이 접근했다.
for (let i = 0; i < rows * columns; i++) {
const numArr = Array(rows * columns)
numArr[i] += i + 1
}
const totalArr = [[0]]
for (let j = 1; j <= rows; j++) {
const arr = [0]
for (let k = 1 + (j - 1) * columns; k <= j * columns; k++) {
arr.push(k)
}
totalArr.push(arr)
}
queries.forEach((query) => {
const newTotalArr = totalArr.map((e) => [...e])
const [x1, y1, x2, y2] = query
let minArr = []
// 위쪽 가로
totalArr[x1][y1] = newTotalArr[x1 + 1][y1]
minArr.push(totalArr[x1][y1])
for (let i = y1 + 1; i <= y2; i++) {
totalArr[x1][i] = newTotalArr[x1][i - 1]
minArr.push(totalArr[x1][i])
}
// 아래쪽 가로
totalArr[x2][y2] = newTotalArr[x2 - 1][y2]
minArr.push(totalArr[x2][y2])
for (let i = y1; i <= y2 - 1; i++) {
totalArr[x2][i] = newTotalArr[x2][i + 1]
minArr.push(totalArr[x2][i])
}
// 왼쪽 세로
totalArr[x2][y1] = newTotalArr[x2][y1 + 1]
minArr.push(totalArr[x2][y1])
for (let i = x1; i <= x2 - 1; i++) {
totalArr[i][y1] = newTotalArr[i + 1][y1]
minArr.push(totalArr[i][y1])
}
// 오른쪽 세로
totalArr[x1][y2] = newTotalArr[x1][y2 - 1]
minArr.push(totalArr[x1][y2])
for (let i = x1 + 1; i <= x2; i++) {
totalArr[i][y2] = newTotalArr[i - 1][y2]
minArr.push(totalArr[i][y2])
}
const newTotalArr = totalArr.map((e) => [...e])
minArr.sort((a, b) => a - b)
minValueArr.push(minArr[0])
function solution(rows, columns, queries) {
for (let i = 0; i < rows * columns; i++) {
const numArr = Array(rows * columns)
numArr[i] += i + 1
}
const totalArr = [[0]]
for (let j = 1; j <= rows; j++) {
const arr = [0]
for (let k = 1 + (j - 1) * columns; k <= j * columns; k++) {
arr.push(k)
}
totalArr.push(arr)
}
const minValueArr = []
queries.forEach((query) => {
const newTotalArr = totalArr.map((e) => [...e])
const [x1, y1, x2, y2] = query
let minArr = []
// 위쪽 가로
totalArr[x1][y1] = newTotalArr[x1 + 1][y1]
minArr.push(totalArr[x1][y1])
for (let i = y1 + 1; i <= y2; i++) {
totalArr[x1][i] = newTotalArr[x1][i - 1]
minArr.push(totalArr[x1][i])
}
// 아래쪽 가로
totalArr[x2][y2] = newTotalArr[x2 - 1][y2]
minArr.push(totalArr[x2][y2])
for (let i = y1; i <= y2 - 1; i++) {
totalArr[x2][i] = newTotalArr[x2][i + 1]
minArr.push(totalArr[x2][i])
}
// 왼쪽 세로
totalArr[x2][y1] = newTotalArr[x2][y1 + 1]
minArr.push(totalArr[x2][y1])
for (let i = x1; i <= x2 - 1; i++) {
totalArr[i][y1] = newTotalArr[i + 1][y1]
minArr.push(totalArr[i][y1])
}
// 오른쪽 세로
totalArr[x1][y2] = newTotalArr[x1][y2 - 1]
minArr.push(totalArr[x1][y2])
for (let i = x1 + 1; i <= x2; i++) {
totalArr[i][y2] = newTotalArr[i - 1][y2]
minArr.push(totalArr[i][y2])
}
minArr.sort((a, b) => a - b)
minValueArr.push(minArr[0])
})
return minValueArr
}
map
을 2번 겹쳐서 2차원 배열을 간단히 만드는 법이 있다. const a = [...Array(rows)].map((_, r)=>[...Array(columns)].map((_, c)=>r*columns+c+1));
Reference
https://programmers.co.kr/learn/courses/30/lessons/77485/solution_groups?language=javascript