N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.
첫째 줄에 N과 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 수가 주어진다.
첫째 줄에 정답 정사각형의 크기를 출력한다.
3 5
42101
22100
22101
9
const fs = require('fs');
let [n, ...input] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
let N = Number(n.trim().split(' ')[0]);
let M = Number(n.trim().split(' ')[1]);
let min = Math.min(N, M);
let square = Array.from({ length: N }, () => new Array(M));
for (let i = 0; i < N; i++) {
input[i] = input[i].trim().split('').map(Number);
for (let j = 0; j < M; j++) {
square[i][j] = input[i][j];
}
}
let max = 0;
for (let i = 0; i < N; i++) {
for (let j = 0; j < M; j++) {
let start = square[i][j];
for (let k = 0; k < min; k++) {
if (i + k >= N || j + k >= M) break;
let width = square[i][j + k];
let height = square[i + k][j];
let end = square[i + k][j + k];
if (width === height && height === end && end === start) {
max = max < (k + 1) ** 2 ? (k + 1) ** 2 : max;
}
}
}
}
console.log(max);
실버3치고는 쉬운 편이었던 것 같다. 알고리즘도 금방 떠올랐던 것 같고, 복잡하게 생각할 게 없어서.. 다만 k에 대해 제대로 생각해주지 않아 조금 삽집할 뻔 했다. 삽질 직전에 원인을 알아서 다행이었다.