쾌락없는 책임 (공부)/알고리즘 문제풀이

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

허스크 2022. 3. 1. 17:51
반응형
 

코딩테스트 연습 - 가장 큰 정사각형 찾기

[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9

programmers.co.kr

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> board)
{
    int answer = board[0][0];

    for(int i = 1; i < board.size(); i++){
        for(int j = 1; j < board[i].size(); j++){
            if(board[i][j]){
                board[i][j] = min(board[i-1][j-1], min(board[i-1][j], board[i][j-1]));
                board[i][j]++;
                answer = max(board[i][j], answer);
            }
        }
    }
    answer *= answer;
    return answer;
}

 다른 블로그들은 그림을 다 그린거 같은데 귀찮아서 제외하겠습니다...

 

 일단 배열에서 0이 아닌 부분은 사각형이 될 수 있으므로 이곳을 만나면 "왼쪽 대각선 위, 왼쪽, 위" 3군데를 보고 이중 최소값을 가져옵니다. 만일 0이 있다면 0을 고르게 되는 것이죠(정사각형이 될 수 없으니). 그런 다음 최솟값 + 1이 해당 지영에서 만들 수 있는 "가장 큰 사각형의 가로"가 됩니다. 이렇게 계속 누적을 시켜서 풀이를 하는 것이죠.

 아마 직접 그리면 더 이해가 잘 될거라고 봅니다.

반응형