https://school.programmers.co.kr/learn/courses/30/lessons/12905
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
접근 방법
- 격자의 크기가 1000 * 1000 이다.
- 격자를 순환하며 격자의 크기를 탐색하는 방법 -> 3차원 배열로 해결할 수 있지만 10^9이므로 시간초과가 발생한다 따라서 O(n^2) 이하의 알고리즘을 사용해야한다
- dp를 사용해 현재 현재 정사각형의 크기를 기록하며 최대값을 비교하자
- 현재 idx를 (r,c) 라고 할때, (r-1,c-1), (r-1,c), (r,c-1), 값과 (r,c)이 모두 1이면 한 변의 길이가 2인 정사각형이다
- 따라서 0인경우는 건너뛴다
- 이전 대각선과 이전 행, 열을가지지 않는 0행, 0열은 1을 그대로 기록한다
- 이외에는 이전 대각선, 이전 행,열을 검사하고 3위치의 최소값+1 이 현재 idx를 갖는 정사각형의 변의 길이이다
- 최대값을 비교하며 갱신한다
- 크기가 필요하므로 최대값의 제곱을 반환한다.
코드
class Solution{
public int solution(int [][]board){
int r = board.length;
int c = board[0].length;
int[][] dp = new int[r][c];
int ans = 0;
for(int i = 0 ; i < r ; i++){
for(int j = 0 ; j < c ; j++){
if(board[i][j] == 0) continue;
if(i == 0 || j == 0) dp[i][j] = 1;
else{
int cur = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j],dp[i][j-1]));
dp[i][j] = cur+1;
}
ans = Math.max(ans,dp[i][j]);
}
}
return ans*ans;
}
}
'Algorithm' 카테고리의 다른 글
[프로그래머스] LV 3 섬 연결하기 (0) | 2024.11.05 |
---|---|
[프로그래머스] LV 2 거리두기 확인하기 (0) | 2024.11.04 |
[프로그래머스] LV 2 테이블 해시 함수 (0) | 2024.11.04 |
[프로그래머스] LV 3 징검다리 건너기 (1) | 2024.11.01 |
[프로그래머스] LV 2 괄호변환 (0) | 2024.11.01 |