알고리즘/프로그래머스
프로그래머스 Lv.2) 가장 큰 정사각형 찾기
Zin0_0
2020. 5. 19. 23:01
반응형
가장 큰 정사각형 찾기
코딩테스트 연습 - 가장 큰 정사각형 찾기
[[0,1,1,1],[1,1,1,1],[1,1,1,1],[0,0,1,0]] 9
programmers.co.kr
풀이
DP를 이용해 이 문제를 풀었다. Top-down을 이용해서 풀었고, board를 돌면서 어떠한 점이 1이라면 그 점을 기준으로 왼쪽, 왼쪽 상단, 상단 세 점의 최소값을 찾아 1을 더해줬다. 이후에 max값을 갱신했고, 탐색이 끝난 후에는 max값의 제곱을 리턴해주었다.
1. board의 모든 점을 탐색한다.
2. board가 1이라면 해당 점을 기준으로 좌측, 좌측 상단, 상단 세 점의 최소값을 찾는다.
2.1 최소값에 +1을 해주어 해당 점에서 만들 수 있는 정사각형의 최대 크기를 저장해주었다.
3. 2번이 끝난 후 max를 갱신해주면서 답을 찾았다.
4. 넓이를 return 해야해서 제곱값을 리턴해주었다.
코드
public class FindMaxSquare_12905 {
final static int[] dx = {-1,0,-1};
final static int[] dy = {-1,-1,0};
private static int solution(int [][]board) {
int answer =0;
int yLen = board.length;
int xLen = board[0].length;
if(yLen ==1 || xLen ==1) {
loop :
for(int[] line : board) {
for(int num : line) {
if(num ==1) {
answer =1;
break loop;
}
}
}
} else {
for(int y=1; y<yLen; y++) {
for(int x=1; x<xLen; x++) {
if(board[y][x]==1) {
int min = 1000;
for(int i=0; i<3; i++) {
int ny = y+dy[i];
int nx = x+dx[i];
min = Math.min(board[ny][nx], min);
}
board[y][x] = min+1;
answer = Math.max(board[y][x], answer);
}
}
}
}
return (int)Math.pow(answer,2);
}
public static void main(String[] args) {
int[][] board = {{0,1,1,1},{1,1,1,1},{1,1,1,1},{0,0,1,0}};
System.out.println(solution(board));
}
}
반응형