๐งธ ํธ๋๋ฐ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ธ์ง๋ง ์์ด๋์ด๋ฅผ ์ค์ค๋ก ์๊ฐํด๋ด์ ๋ฟ๋ฏํ๋ค. left,right,diagonal์ dp๊ฐ ์๋ arr๊ฐ์ ๋ฃ์ด ํค๋งธ๋๋ฐ ๋ฐ๋ก๋ฅผ ์ฐพ์ผ๋ฉด์ ์๋ชป๋๊ฑธ ๊นจ๋ฌ์๋ค.
๐ก flat() ์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์์๋ค. ์ด์ฐจ์ ๋ฐฐ์ด์์ ์ต๋๊ฐ์ ๊ตฌํ ๋ ์ ์ฉํ ๊ฒ ์ธ ๊ฒ ๊ฐ๋ค.
๐ ๋ค๋ฅธ ๋ถ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ "left === up && up === diagonal" ์กฐ๊ฑด ์์ด "dp[n][m] = (Math.sqrt(Math.min(left, up, diagonal))+1) ** 2" ๋ง ์ฐ๋ฉด ๋๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ๊ทธ๋ฆฌ๊ณ dp์ ๋์ด๋ฅผ ์ง์ ๋ฃ์ง ์๊ณ ๋ง์ง๋ง์ ์ ๊ณฑํด์ฃผ๋ฉด ๋ ๊ฐ๋จํ๊ฒ ์ธ ์ ์๋ค.
์ฝ๋
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [N, M] = input.shift().split(" ").map(Number);
const arr = input.map((item) => item.split("").map(Number));
const dp = Array.from(new Array(N), () => new Array(M));
for (let n = 0; n < N; n++) {
for (let m = 0; m < M; m++) {
if (arr[n][m] === 1) {
let left = 0;
let up = 0;
let diagonal = 0;
//๋ฐฐ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์์ผ๋ฉด
if (m - 1 >= 0 && n - 1 >= 0) {
left = dp[n][m - 1];
up = dp[n - 1][m];
diagonal = dp[n - 1][m - 1];
}
if (left === up && up === diagonal) {
dp[n][m] = (Math.sqrt(left) + 1) ** 2;
} else {
dp[n][m] = (Math.sqrt(Math.min(left, up, diagonal))+1) ** 2;
}
} else {
dp[n][m] = 0;
}
}
}
console.log(Math.max(...dp.flat()));