Problem
Problem URL : 가장 큰 정사각형 찾기
[1] Answer Code (18. 07. 25)
int dp[1001][1001];
int solution(vector<vector<int>> board){
int answer = 0;
int r_size = (int)board.size();
int c_size = (int)board[0].size();
for(int i=0; i<r_size; i++){
for(int j=0; j<c_size; j++){
if( i==0 || j == 0) {
dp[i][j] = board[i][j];
answer = answer < dp[i][j] ? dp[i][j] : answer; // [1]
continue;
}
if(board[i][j]){
dp[i][j] = min({ dp[i-1][j], dp[i][j-1], dp[i-1][j-1] }) + 1;
answer = answer < dp[i][j] ? dp[i][j] : answer;
}
}
}
answer *= answer;
return answer;
}
-
구현만 생각하다보니 너무 어렵게 접근했다.
-
DP를 생각못했다. 다시 풀어봐야지 !
-
[1]을 뺴고 제출했더니 TC 1만 틀리더라 …
[ 1 1 ] 이렇게 들어왔을 때 [1]이 없으면 0을 Return한다.
-
DP 아이디어는 다음과 같다.
[2] Wrong Code (21. 01. 24)
class Solution {
public int solution(int[][] board) {
int defaultAnswer = 1;
int xLength = board.length;
int yLength = board[0].length;
int n = Math.min(xLength, yLength);
for (int i = n; i >= 0; i--) {
if (solution(board, i, 0, 0)) {
return i * i;
}
}
return defaultAnswer;
}
private boolean solution(int[][] board, int n, int xPos, int yPos) {
for (int i = xPos; i < board.length - n + 1; i++) {
for (int j = yPos; j < board[0].length - n + 1; j++) {
if (check(board, n, i, j)) {
return true;
}
}
}
return false;
}
private boolean check(int[][] board, int n, int xPos, int yPos) {
for (int i = xPos; i < xPos + n; i++) {
for (int j = yPos; j < yPos + n; j++) {
if (isZero(board, i, j)) {
return false;
}
}
}
return true;
}
private boolean isZero(int[][] board, int xPos, int yPos) {
return board[xPos][yPos] == 0;
}
}
-
정확성 테스트는 다 맞았으나
효율성에서 시간 초과가 발생했다.
사실 문제 접근 시 불안했던 부분이었는데 역시나 발생했다. -ㅂ-
-
위 아이디어의 핵심은 그냥 빡구현이였다.
3년전과 같게 DP 자체 생각을 못 했다.
역시 사람의 사고력은 쉽게 발전하지 않는구나를 깨달았다.
[3] Answer Code (21. 01. 24)
class Solution {
public int solution(int[][] board) {
int answer = 0;
int xLength = board.length;
int yLength = board[0].length;
int up, left, upLeft;
for (int i = 1; i < xLength; i++) {
for (int j = 1; j < yLength; j++) {
if (board[i][j] == 1) {
up = board[i - 1][j];
left = board[i][j - 1];
upLeft = board[i - 1][j - 1];
board[i][j] = getMinValue(up, left, upLeft) + 1;
}
}
}
// [1]
for (int i = 0; i < xLength; i++) {
for (int j = 0; j < yLength; j++) {
answer = Math.max(answer, board[i][j]);
}
}
return answer * answer;
}
private int getMinValue(int up, int left, int upLeft) {
return Math.min(Math.min(up, left), upLeft);
}
}
-
DP로 다시 풀어봤다.
-
[1] : 1,1부터 체크하므로
answer 값을 구할 시 [0,0 / 0,1 / 1,0] 값에 대해서 체크를 해줘야 한다.