[#24][알고리즘] 가장 큰 정사각형 찾기
프로그래머스 > 가장 큰 정사각형 찾기
문제 링크(https://programmers.co.kr/learn/challenge_codes/187)C++풀이
#include<iostream>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
int findLargestSquare(vector<vector<char>> board)
{
int answer = -2;
int dp[1000][1000] = {0};
//숫자 0, 1로 변환
for(int i = 0; i < board.size(); i++)
for(int j = 0; j <board[0].size(); j++){
if(board[i][j] == 'O')
dp[i][j] = 1;
}
for(int i = 1; i < board.size(); i++)
for(int j = 1; j < board[0].size(); j++){
if(dp[i][j] == 1){
dp[i][j] = min(dp[i-1][j-1],min(dp[i][j-1], dp[i-1][j]))+1;
answer = max(dp[i][j], answer);
}
}
// 배열dp에 저장된 최대값의 제곱을 리턴
answer = pow(answer,2);
return answer;
}
int main()
{
vector<vector<char>> board{
{'X','O','O','O','X'},
{'X','O','O','O','O'},
{'X','O','O','O','O'},
{'X','X','X','X','X'},
{'X','X','X','X','X'}};
//아래는 테스트 출력을 위한 코드입니다.
cout<<findLargestSquare(board);
}
| cs |
dp배열의 값이 1일 때(입력 값 O)만 정사각형 찾기 검사 시작
dp[1][1]부터 dp[4][4]에 대하여
dp[i][j] = dp[i][j] 기준 왼쪽, 위쪽, 왼쪽대각선 값을 확인하여 가장 작은 값 + 1(원래 가지고있던 값)
- i=1, j=1일 때
1 * 1 크기의 정사각형이 있음
- i=1, j=2일 때
2 * 2 크기의 정사각형이 있음
- i=1, j=3일 때
2 * 2 크기의 정사각형이 있음
=> dp[i][j]를 완성하며 최대값을 찾음( answer )
정사각형의 넓이를 return해야하므로 answer 제곱을 리턴
댓글
댓글 쓰기