알고리즘/삼성 Certi
[SWEA 4062] Largest Empty Square - C++
SangJunni
2025. 2. 27. 00:00
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제
주어진 N*N흑백 이미지에서 검은 점을 포함하지 않는 가장 큰 빈 정사각형을 찾으시오.
입력
첫 줄에 테스트케이스의 개수 T가 주어진다. (1 ≤ T ≤ 10)
각 테스트 케이스 첫째 줄에는 전체 맵의 크기 N이 주어진다(1 ≤ N ≤ 1,000).
그 다음 N줄에 걸쳐서 N개의 ‘0’또는 ‘1’이 입력된다. ‘0’은 비어있는 칸을 뜻하고, ‘1’은 검은 점을 뜻한다.
풀이
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int N;
int field[1001][1001] = { 0 };
int dp[1001][1001] = { 0 };
int main(int argc, char** argv)
{
int test_case;
int T;
//freopen("input.txt", "r", stdin);
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
cin >> N;
string line;
for (int i = 0; i < 1001; i++)
{
for (int j = 0; j < 1001; j++)
{
field[i][j] = 0;
dp[i][j] = 0;
}
}
for (int i = 1; i < N + 1; i++)
{
cin >> line;
for (int j = 1; j < N + 1; j++)
{
field[i][j] = 1 - int(line[j - 1] - '0');
}
}
int answer = 0;
for (int i = 1; i < N + 1; i++)
{
for (int j = 1; j < N + 1; j++)
{
if (field[i][j] == 1)
{
dp[i][j] = min({ dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] }) + 1;
answer = max(answer, dp[i][j]);
}
}
}
cout << "#" << test_case << " " << answer << endl;
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
해결방법
DP를 활용하여 해결할 수 있는 문제입니다. 해당 문제는 백준에서도 주어지는 가장 기본적인 유형 문제이므로 해당 문제 풀이 방법에 대해서 잘 모르겠으면 가장 큰 정사각형(1915) 문제를 풀어보는 것을 권장합니다.