코테/백준

[백준/JAVA] 1915번: 가장 큰 정사각형

imname1am 2023. 5. 16. 16:36
반응형

🔺 문제

 

1915번: 가장 큰 정사각형

첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.

www.acmicpc.net

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
import java.io.*;
 
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());
 
        long max = 0;
        
        // DP 배열 초기화
        long[][] DP = new long[1001][1001];
        for(int i = 1 ; i <= n ; i++) {
            String[] str = br.readLine().split("");
            for(int j = 1 ; j <= m ; j++) {
                DP[i][j] = Long.parseLong(str[j - 1]);
            }
        }
        
        // 점화식 이용해 배열 채우기
        for(int i = 1 ; i <= n ; i++) {
            for(int j = 1 ; j <= m ; j++) {
                // 현재 자리의 원래 값이 1이라면,
                // 이 위치의 위.왼.대각선 왼쪽 위 값 中 가장 작은 값 + 1
                if(DP[i][j] == 1 && i > 0 && j > 0) {
                    DP[i][j] = Math.min(Math.min(DP[i - 1][j - 1], DP[i][j - 1]), DP[i - 1][j]) + 1;
                }
                
                // 최댓값 업데이트
                if(max < DP[i][j]) {
                    max = DP[i][j];
                }  
            }
        }
        System.out.println(max * max);
        br.close();
    }
}
cs
✅ 해결 아이디어
✔ DP - 점화식
- DP[ i ][ j ] : i,j의 위치를 오른쪽 아래 꼭짓점으로 정하고, 해당 자리에서 그릴 수 있는 최대 정사각형의 변의 길이

 


🔺 다른 풀이들

 

[BOJ] 백준 1915번 : 가장 큰 정사각형 (JAVA)

문제 n×m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오. 위와 같은 예제에서는 가운데의 2×2 배열이 가장 큰 정사각형이다. 입력 첫째

steady-coding.tistory.com

 

[BOJ 백준] 가장 큰 정사각형 (1915) Java

링크 : https://www.acmicpc.net/problem/1915 문제 설명 : 더보기 n×m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오. 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 위와

subbak2.com


💬 느낀 점

2차원 배열 DP... 배열 의미를 정의하는거부터 쉽지 않구만...

 

 

1회독 2회독 3회독 4회독 5회독
V 7/7      

 

 

(+7/7 2회독)

맙소사... 변한 부분이라고는 입력 받는 부분 조금 다를 뿐인데...

메모리랑 시간 차이가 이렇게 날수가... ㄴㅇㄱ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
import java.io.*;
 
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());
        
        long[][] dp = new long[n][m];
        for(int i = 0 ; i < n ; i++) {
            char[] ch = br.readLine().toCharArray();
            for(int j = 0 ; j < m ; j++) {
                dp[i][j] = ch[j] - '0';
            }
        }
        
        long max = 0;
        for(int i = 0 ; i < n ; i++) {
            for(int j = 0 ; j < m ; j++) {
                if(dp[i][j] == 1 && i > 0 && j > 0) {
                    dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + dp[i][j];
                }
                if(max < dp[i][j]) {
                    max = dp[i][j];
                }
            }
        }
        System.out.println(max * max);
    }
}
 
cs


(참고)

✔ Do it 알고리즘 코딩테스트 자바편

 

반응형