본문 바로가기
알고리즘/문제 풀이 (출처: 프로그래머스)

[Java] 가장 큰 정사각형 찾기_프로그래머스 알고리즘 문제 해설

by 이민우 2020. 10. 28.
728x90
반응형

출처 : https://programmers.co.kr/learn/courses/18/lessons/1879#

 

알고리즘 문제 해설 - 가장 큰 정사각형 찾기

프로그래머스의 모의테스트는 프로그래머스의 시스템에 익숙해지기 위한 테스트이며, 문제 자체는 2018 1ST KAKAO BLIND RECRUITMENT와 전혀 관계없습니다. 다만 모의테스트의 풀이에 대한 요청이 있어

programmers.co.kr

문제 설명

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

예를 들어

1234

0 1 1 1
1 1 1 1
1 1 1 1
0 0 1 0

가 있다면 가장 큰 정사각형은

1234

0 1 1 1
1 1 1 1
1 1 1 1
0 0 1 0

가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다.

제한사항

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

입출력 예

boardanswer

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

입출력 예 설명

입출력 예 #1
위의 예시와 같습니다.

class Solution
{
    public int solution(int [][]board)
    {
        int answer = 1;
        
        Boolean chk = true;
        for(int i=0; i<board.length; i++) {
            for(int j=0; j<board[i].length; j++) {
                if(board[i][j] == 1) {
                    chk = !chk;
                    break;
                }
            }
            if(!chk) break;
        }
        if(chk) return 0;
        
        for(int i=1; i<board.length; i++) {
            for(int j=1; j<board[i].length; j++) {
                if(board[i][j] != 0) {
                    if(board[i-1][j] != 0 && board[i][j-1] != 0 && board[i-1][j-1] != 0) {
                        board[i][j] = Math.min(board[i-1][j], Math.min(board[i][j-1], board[i-1][j-1])) + 1;
                        if(board[i][j] > answer) answer = board[i][j];
                    }
                }
            }
        }

        return answer*answer;
    }
}
728x90
반응형