https://www.acmicpc.net/problem/1915
풀이
1로 채워진 가장 큰 정사각형을 구하는 문제이다.
주어진 0과 1을 이차원배열에 넣고 dp배열을 만들어 채워나간다.
원래 배열의 값이 0이면 dp배열의 값도 0이 되고,
원래 배열의 값이 1이면 dp배열의 [i-1][j], [i][j-1], [i-1, j-1]값을 확인해야 한다.
저 값들 중 가장 작은 값에 1을 더해주면 현재 위치를 끝으로 하는 정사각형의 길이가 된다.
길이의 최댓값을 갱신하며 dp배열을 채우고 넓이를 구해주면 끝.
메모리: 27708KB
시간: 332ms
언어: Java 11
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] arr = new int[n + 1][m + 1];
for (int i = 1; i < n + 1; i++) {
String line = br.readLine();
for (int j = 1; j < m + 1; j++) {
arr[i][j] = line.charAt(j - 1) - '0';
}
}
int[][] dp = new int[n + 1][m + 1];
int max = 0;
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
if (arr[i][j] == 0) {
dp[i][j] = 0;
} else {
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
max = Math.max(max, dp[i][j]);
}
}
System.out.println(max * max);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 13325: 이진 트리 - JAVA (0) | 2024.05.14 |
---|---|
[백준] 1613: 역사 - JAVA (0) | 2024.05.14 |
[백준] 2011: 암호코드 - JAVA (0) | 2024.05.14 |
[백준] 2357: 최솟값과 최댓값 - JAVA (0) | 2024.05.14 |
[백준] 1725: 히스토그램 - JAVA (0) | 2024.05.14 |
[백준] 11000: 강의실 배정 - JAVA (0) | 2024.05.14 |