728x90
문제
1과 0으로 이루어진 NxM크기의 행렬이 주어졌을 때, 1로만 이루어진 가장 큰 정사각형 부분 행렬 찾는 프로그램을 작성하시오.
입력
입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 N과 M이 주어진다. (1 ≤ N,M ≤ 1,000) 다음 N개의 줄에는 공백으로 구분된 M개의 수가 주어진다. 마지막 줄에는 0이 두 개가 주어진다.
출력
각 테스트 케이스에 대해서 가장 큰 정사각형의 너비 또는 높이를 출력한다. 만약 그런 정사각형이 없을 때는 0을 출력한다.
풀이
입력받은 행렬에서 좌측 상단부터 우측 하단으로 이동하며 사각형이 만들어 질 수 있는 형태를 구한다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
int max=0;
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()), m=Integer.parseInt(st.nextToken());
if(n==0)
break;
int [][] arr = new int[n+1][m+1], dp = new int[n+1][m+1];
for(int i=1;i<=n;i++) {
st = new StringTokenizer(br.readLine());
for(int j=1;j<=m;j++)
arr[i][j]=Integer.parseInt(st.nextToken());
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++)
{
if(arr[i][j]==0)
continue;
int tmp = Math.min(Math.min(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]);
// 정사각형이 되기 위해서는 좌측, 상단, 좌상단이 존재해야하므로 이 세가지 수 중에서 가장 작은 것을 이용하여 사각형의 크기를 설정한다
dp[i][j]=tmp+1;
if(max<dp[i][j])
max=dp[i][j];
}
}
System.out.println(max);
}
}
}
728x90
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
Baekjoon 6064 카잉 달력 JAVA (0) | 2022.04.23 |
---|---|
Baekjoon 16928 뱀과 사다리 게임 JAVA (0) | 2022.04.20 |
Baekjoon 21608 상어 초등학교 JAVA (0) | 2022.04.20 |
Baekjoon 11660 구간 합 구하기 5 JAVA (0) | 2022.04.19 |
Baekjoon 2407 조합 JAVA (0) | 2022.04.19 |
댓글