-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
407b3ab
commit 379a975
Showing
1 changed file
with
79 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// 가장 큰 정사각형 : 동적 계획법 | ||
const input = require("fs") | ||
.readFileSync("/dev/stdin") | ||
.toString() | ||
.trim() | ||
.split("\n"); | ||
const [row, col] = input | ||
.shift() | ||
.split(" ") | ||
.map((v) => Number(v)); | ||
const map = input.map((v) => v.split("").map((v) => Number(v))); | ||
const dptable = map.map((v) => v.slice().fill(0)); | ||
let answer = 0; | ||
|
||
for (let i = 0; i < col; i++) { | ||
if (map[0][i]) { | ||
dptable[0][i] = 1; | ||
answer = 1; | ||
} | ||
} | ||
|
||
for (let i = 0; i < row; i++) { | ||
if (map[i][0]) { | ||
dptable[i][0] = 1; | ||
answer = 1; | ||
} | ||
} | ||
|
||
for (let i = 1; i < row; i++) { | ||
for (let j = 1; j < col; j++) { | ||
if (map[i][j]) { | ||
const up = dptable[i - 1][j]; | ||
const left = dptable[i][j - 1]; | ||
const upleft = dptable[i - 1][j - 1]; | ||
|
||
dptable[i][j] = Math.min(up, left, upleft) + 1; | ||
answer = Math.max(answer, dptable[i][j]); | ||
} | ||
} | ||
} | ||
|
||
console.log(answer * answer); | ||
|
||
// 4 4 | ||
// 0100 | ||
// 0111 | ||
// 1110 | ||
// 0010 | ||
|
||
// Try 1 | ||
// - 브루트 포스 => 시간 초과 | ||
// - 브루트 포스 기반으로 maxLen을 얼마나 답과 가까이 구할 수 있는가가 속도를 빠르게 하는 유일한 방법인 듯 | ||
// - 1) 행, 열별 연속으로 나오는 최대 개수를 저장하는 1차원 배열. e.g. [1, 3, 3, 1], [1, 3, 3, 1] | ||
// - 정사각형을 만들기 위해 필요한 조건처럼은 보이지 않는다 | ||
// - 2) 누적합 2차원 배열 | ||
// - 아직 시도하지 않았다 | ||
// - Math.min(maxRow, maxCol, Math.floor(Math.sqrt(countOne))) | ||
|
||
// Try 2 | ||
// - 동적 계획법 | ||
// - dptable[i][j] : i행 j열에서 가장 큰 정사각형의 변의 길이 | ||
// - 현재 위치에서 가장 긴 길이를 구하기 위해서는, 현재 지점을 오른쪽 아래 끝으로 하는 정사각형 내의 모든 값을 확인해야 한다 | ||
// - 하지만 당연히 시간 초과가 발생한다 | ||
// - dptable을 이용하여 up, left, upleft 세 군데만 확인하면 된다 | ||
// - dptable에서 특정 값은 그 이전의 이미 센 정사각형의 값을 저장하는 효과가 있다 | ||
|
||
// 4 4 | ||
// 1111 | ||
// 1111 | ||
// 1101 | ||
// 1111 | ||
|
||
// dptable | ||
// 1111 | ||
// 1222 | ||
// 1201 | ||
// 1211 | ||
|
||
// BSQ : 어렵게 생각하면 어렵고, 쉽게 생각하면 쉬운 문제 |