Java

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

iheeeee6-6 2023. 5. 22. 16:20
728x90

https://www.acmicpc.net/problem/1915

 

1915번: 가장 큰 정사각형

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

www.acmicpc.net

 

dp를 사용해서 해결할 수 있었다.

 

ㅁㅁㅁㅁ

ㅁㅁ

ㅁㅁㅁㅁ

ㅁㅁㅁㅁ

 

이런식으로 왼쪽, 위, 왼쪽 대각선 부분을 확인하여 해당 위치들에서 가장 작은 값에 +1한 값을 넣는다. 

그리고 그 값이 가장 큰 값인지 확인한다.

 

ex)

1 1 1 0

1 1 1 0

1 1 1 0

1 1 1 1

인덱스의 시작은 (1,1) 이다!

 

(1,1)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 다 0이므로  0+1 값을 넣는다.

(1,2)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 0이므로  0+1 값을 넣는다.

(1,3)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 0이므로  0+1 값을 넣는다.

(1,4)에 0이 존재하므로 스킵

(2,1)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 0이므로  0+1 값을 넣는다.

(2,2)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 1이므로  1+1 값을 넣는다.

-> 현재 기준 최댓값은 (2,2)의 2이므로 최댓값을 2로 세팅

1 1 1 0

1 2 1 0

1 1 1 0

1 1 1 1

 

(2,3)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 1이므로  1+1 값을 넣는다.

-> 

1 1 1 0

1 2 2 0

1 1 1 0

1 1 1 1

 

(2,4)에 0이 존재하므로 스킵

(3,1)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 0이므로  0+1 값을 넣는다.

(3,2)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 1이므로  1+1 값을 넣는다.

->

1 1 1 0

1 2 2 0

1 2 1 0

1 1 1 1

(3,3)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 2이므로  2+1 값을 넣는다.

-> 현재 기준 최댓값은 (3,3)의 3이므로 최댓값을 3로 세팅

1 1 1 0

1 2 2 0

1 2 3 0

1 1 1 1

(3,4)에 0이 존재하므로 스킵

 

(4,1)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 0이므로  0+1 값을 넣는다.

(4,2)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 1이므로  1+1 값을 넣는다.

(4,3)에 1이 존재하므로, 왼쪽, 위, 왼쪽 대각선을 확인한다. -> 가장 작은 값은 1이므로  1+1 값을 넣는다.

(4,4)에 0이 존재하므로 스킵

 

따라서, 최대 넓이 값은 3*3 = 9 이다!

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static int[][] arr;
	static int result = 0, n, m;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		arr = new int[n + 1][m + 1];
		for (int i = 1; i <= n; i++) {
			String str = br.readLine();
			for (int j = 1; j <= m; j++) {
				arr[i][j] = str.charAt(j - 1) - '0';
			}
		}

		if (n == 1 && m == 1) {
			System.out.println(arr[1][1]);
			return;
		}

		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (arr[i][j] == 1) {
					arr[i][j] = Math.min(arr[i - 1][j], Math.min(arr[i][j - 1], arr[i - 1][j - 1])) + 1;
					result = Math.max(arr[i][j], result);
				}
			}
		}

		System.out.println(result*result);

	}

}

'Java' 카테고리의 다른 글

[백준 2631] 줄세우기 (JAVA)  (0) 2023.05.23
[백준 2579] 계단 오르기 (JAVA)  (0) 2023.05.23
[백준 11501] 주식 (JAVA)  (0) 2023.05.21
[백준 1515] 수 이어 쓰기 (JAVA)  (0) 2023.05.17
[백준 1527] 금민수의 개수 (JAVA)  (0) 2023.05.12