https://programmers.co.kr/learn/courses/30/lessons/12905
코딩테스트 연습 - 가장 큰 정사각형 찾기
[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9
programmers.co.kr
문제 설명
1로 구성된 가장 큰 정사각형의 넓이를 구하는 문제이다.위와 같은 경우 답은 9이다.
문제풀이 방법
***DP문제****
우측 맨밑 좌표를 기준으로 넓혀가는 느낌...!
- 0이면 패스한다.
- 1이 나오면 왼쪽, 위, 왼쪽 대각선의 요소들을 검사한다.
Step1
- 1이 나오면 왼쪽, 위, 왼쪽 대각선의 요소들을 검사한다.
- 왼쪽, 위, 왼쪽 위 대각선에 값이 없으면 pass
- 0이 나오면 X
- 왼쪽, 위, 왼쪽 위 대각선에 값이 1이면 검사했던 값의 최소 값에서 +1 해준다.
0 | 1(pass) | 1(pass) | 1(pass) |
1(pass) | 1 | 1(->2) | 1(->2) |
1(pass) | 1(->2) | 1(->2) | 1(->3) |
0(pass) | 1 | 1 | 0(pass) |
Step2
- 해당 값은 정사각형의 한 번의 길이가 된다. 따라서 제곱을 하면 닶.
점화식
board[i][j] = min(board[i-1][j],board[i[[j-1],board[i-1][j-1]) +1;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int map[1001][1001] = {0,};
int solution(vector<vector<int>> board)
{
int answer=board[0][0];
int max = -987654321;
for(int i = 1 ; i < board.size() ; i++){
for(int j = 1 ; j < board[i].size() ; j++){
if(board[i][j]==0)
continue;
if(board[i][j]==1){
board[i][j] = min({board[i-1][j],board[i-1][j-1],board[i][j-1]})+1;
}
if(board[i][j] > max) {
max = board[i][j];
}
}
}
if(max==-987654321){
answer = board[0][0];
}else{
answer = max*max;
}
// [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
//cout << "Hello Cpp" << endl;
return answer;
}