가장 큰 정사각형 찾기 (프로그래머스) - C++
2021. 2. 20. 20:54ㆍAlgorithm
- 문제
- 표에서 1로 이루어진 가장 큰 정사각형을 찾아 넓이를 return 하는 solution 함수를 완성해 주세요.
- (단, 정사각형이란 축에 평행한 정사각형을 말합니다.)
- 설명
- 1와 0로 채워진 표(board)가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다.
0 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
0 | 0 | 1 | 0 |
- 풀이
- 표에서 1로 이루어진 가장 큰 정사각형을 찾아야한다.
- 왼쪽 위에서부터 채워나가면서 가장 큰 정사각형을 찾는다.
- 격자로 이루어진 맵에서 출발지에서 목적지까지 최단거리를 구하는 문제와 유사하다.
- 하지만 이 문제는 왼쪽 위 대각선까지 포함하여, 왼쪽, 위, 대각선 3가지 방향을 고려해야한다. --> [i-1][j] , [i][j-1] ,[i-1][j-1]
- 만약 해당 인덱스에 값이 1이라면 3가지 방향의 값 중 최솟값(가장 작은 정사각형의 크기) + 1 을 해준다.
- 만약 해당 인덱스에 값이 0이라면 그 인덱스에는 정사각형이 존재할 수 없으므로 그대로 0을 입력한다. (웅덩이와 같음)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int square_size(int left , int up , int cross)//세방향(왼쪽 위 대각선)의 값 중 가장 작은 값 + 1을 반환한다. { return min(min(left,up),cross) +1; } int solution(vector<vector<int>> board) { int answer = 0; for(int i = 0 ; i < board.size() ; i++) { for(int j = 0 ; j < board[i].size() ; j++) { if(i == 0 || j == 0)//가장자리는 1 또는 0 이므로 그 값 그대로 들어간다. { answer = max(answer , board[i][j]); } else// 가장자리가 아닌 곳들은 { if(board[i][j] == 1)//정사각형이 존재할 수 있다면(존재한다면) { board[i][j] = square_size(board[i][j-1] , board[i-1][j] , board[i-1][j-1]);//해당 위치에 확장 가능한 최대한의 크기를 입력한다. answer = max(answer , board[i][j]*board[i][j]);//최댓값을 갱신해준다. } } } } return answer; } | cs |
'Algorithm' 카테고리의 다른 글
숫자의 표현 (프로그래머스) - C++ (0) | 2021.02.22 |
---|---|
땅따먹기 (프로그래머스) - C++ (0) | 2021.02.22 |
최댓값과 최솟값 (프로그래머스) - C++ (0) | 2021.02.20 |
최솟값 만들기 (프로그래머스) - C++ (0) | 2021.02.20 |
다음 큰 숫자 (프로그래머스) - C++ (0) | 2021.02.20 |