[프로그래머스] 가장 큰 정사각형 찾기(JAVA)
업데이트:
문제 설명
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으로만 이루어져 있습니다.
입출력 예
board | answer |
---|---|
[[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 |
JAVA 풀이 과정
class Solution
{
public int solution(int [][]board)
{
int x = board.length;
int y = board[0].length;
int max = 0;
if(x <= 1 || y <= 1) return 1;
for(int i = 1; i < x; i++){
for(int j = 1; j < y; j++){
if(board[i][j] >= 1){
int up = board[i-1][j];
int left = board[i][j-1];
int upperLeft = board[i-1][j-1];
int min = Math.min(up, left);
min = Math.min(min, upperLeft);
board[i][j] = min+1;
max = Math.max(max, min+1);
}
}
}
return max*max;
}
}
오늘도 역시 답을 봤다. ㅎㅎ 일단 알고리즘 로직을 생각을 해보긴 했는데 구현할 능력이 부족한 것 같다.
일단 생각은 역시나 완벽했다.
- board x, y 구하기
- 1,0 인덱스를 기준으로 위, 왼쪽, 아래가 1인지 확인하기
- 만약 주변에 0이 있으면 기준 인덱스 변경
- 정사각형 모양으로 1이 있으면 max에 저장
- 또 있으면 max와 비교 후 더 큰 정사각형 크기를 저장
이렇게 생각했는데 손가락은 왜 뇌를 못따라가는지,,^^(소라게)
다른 사람의 코드보다는 어떤 방식으로 접근했어야 했는지를 살펴보자.
먼저 내가 프로그래머스에서 제일 좋아하는 ‘질문하기’ 버튼을 눌러 힌트를 얻고자 좀 기웃거려봤는데 어마어마한 정보를 습득했다.
정말 천사가 아닐까..
암튼 저 링크를 타고 들어가서 봤는데 오,,,, 봐도봐도 무슨 얘긴지 잘 와닿지가 않았다. 오…… ^^… 그래서 답을 찾아 소스를 분석쓰 해봤다.
정답 코드의 알고리즘 순서
- board 배열 x, y 축 길이 구하기
- board가 1렬 혹은 1행으로만 올 경우 가장 큰 정사각형은 1 이 경우 조건을 따로 걸어줘야함.
- board 1,0이 아닌^^
(1, 1)
기준으로 시작 - board[i][j]가 1 이상인 경우에 위, 왼, 왼쪽 위 값 구하기
- 위, 왼, 왼쪽 위 값의 최솟값에 +1 해주기
- 최솟값+1을 board[i][j]에 저장
- max = 0과 최솟값+1를 비교해 더 큰 값을 max에 저장
- 그리고 그 다음 인덱스(1,2)의 위, 왼, 왼쪽 위 값 구하기
- max = 1과 최솟값+1을 비교해 더 큰 값을 max에 저장
- 반복
- max 제곱 후 반환
나중에 따로 DP….. 정리해야겠다…..
댓글남기기