/ [프로그래머스][C++][12905] 가장 큰 정사각형 찾기
본문 바로가기
코테준비/수학적 알고리즘

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

by sayho98 2023. 3. 11.

[문제 출처]

https://school.programmers.co.kr/learn/courses/30/lessons/12905

1. 문제

설명

1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요. (단, 정사각형이란 축에 평행한 정사각형을 말합니다.)

예를들어

가 있다면 가장 큰 정사각형의 넓이는 9가 되므로 9를 반환해 주면 됩니다.

 

제한사항

  • 표(board)는 2차원 배열로 주어집니다.
  • 표(board)의 행(row)의 크기 : 1,000 이하의 자연수
  • 표(board)의 열(column)의 크기 : 1,000 이하의 자연수
  • 표(board)의 값은 1또는 0으로만 이루어져 있습니다.

 

입출력 예

 

2. 설명

 

우선 값이 0이면 지나가고, 1일때 조건에 넣습니다. 현재좌표가 (1,1)이라면  상단, 좌단, 좌상단3가지 값중에서 가장큰것+1을 현재좌표의 값을 넣습니다. 이렇게 하면 만약 0이포함되어있으면 그대로1이고, 1만있을경우 2로 되는식입니다. 
즉 다른값들이 있으면 원래값을 유지하고, 같은값들만 있을때 1을 증가시킵니다.

 

 answer은 갱신한 값들중 가장 큰것을 저장하고, 넓이를 구해야하니 제곱을 해서 값을 반환하여 줍니다.

 

3. 코드

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

int solution(vector<vector<int>> board)
{
    int answer = board[0][0];
    
    for(int y=1; y<board.size(); y++){
        for(int x=1; x<board[0].size();x++){
            if(board[y][x]==1){
                board[y][x]=1+min({board[y-1][x-1],board[y-1][x],board[y][x-1]});
                answer=max({answer,board[y][x]});
            }
        }
    }

    return answer*answer;
}
반응형

댓글