문제풀이/프로그래머스

[프로그래머스] 가장 큰 정사각형 찾기

Hyeon-Uk 2021. 10. 10. 21:28
반응형

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


 

풀이

풀이는 dp를 이용해서 문제를 해결했다.

해당칸이 1이라면, 자신의 좌, 좌상, 상 부분을 검사해준다. 이때 3구역중 가장 작은부분+1을 해준것이, 해당칸을 포함한 정사각형의 변이 된다.

 

시간복잡도

2차원배열을 독립적으로 두번만 탐색하면되므로, O(N2)이 된다.

 

코드

#include <iostream>
#include<algorithm>
using namespace std;

int dp[1001][1001]={0};
int arr[1001][1001]={0};
int solution(vector<vector<int>> board)
{
    int answer=0;
    int h=board.size();
    int w=board[0].size();
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            arr[i+1][j+1]=board[i][j];
        }
    }
    
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            if(arr[i][j]==1){
                dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
                answer=max(answer,dp[i][j]);
            }
        }
    }

    return answer*answer;
}

 

반응형