문제 링크입니다: https://www.acmicpc.net/problem/1915
(←, ↖, ↑의 인덱스 값 중 최소) + 1이 (i, j)에서 만들 수 있는 가장 큰 정사각형 변의 길이라는 것을 알아내는 것이 핵심이였던 문제였습니다.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int MAX = 1000;
int N, M;
string arr[MAX];
int cache[MAX][MAX];
int getArea(void)
{
int side = 0; //변의 최대 길이
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
{
//세 방향 확인할 수 없는 경우
if (i == 0 || j == 0)
cache[i][j] = arr[i][j] - '0';
else if (arr[i][j] == '1')
//←, ↖, ↑ 방향을 확인 후 최소 값 + 1
cache[i][j] = min(min(cache[i][j - 1], cache[i - 1][j - 1]), cache[i - 1][j]) + 1;
side = max(side, cache[i][j]);
}
return side * side;
}
int main(void)
{
cin >> N >> M;
if (N<1 || N>MAX || M<1 || M>MAX)
exit(-1);
for (int i = 0; i < N; i++)
cin >> arr[i];
cout << getArea() << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 13458 시험 감독 (0) | 2018.03.07 |
---|---|
백준 10942번 팰린드롬? (0) | 2018.03.07 |
백준 11054번 가장 긴 바이토닉 부분 수열 (0) | 2018.03.05 |
백준 2225번 합분해 (0) | 2018.03.05 |
백준 2096번 내려가기 (0) | 2018.03.03 |