Algorithm

백준 1051번 <숫자 정사각형>

seungh2 2022. 7. 27. 22:57

백준 알고리즘 1051번

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

 

1051번: 숫자 정사각형

N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행

www.acmicpc.net


1051번

n*m 크기의 직사각형이 있다. 각 칸에 한 자리 숫자가 적혀있을 때, 이 직사각형 안에서 가장 큰 정사각형의 크기를 찾아라. 이때 정사각형은 각 꼭짓점에 쓰여있는 수가 모두 같아야 한다.

 

입력으로 첫 줄에 n과 m이 주어진다. 그 다음 n줄에 걸쳐 직사각형에 대한 정보가 주어진다.

 

출력으로 해당 직사각형에서 가장 큰 정사각형의 크기를 구해서 출력하면 된다.


문제 해결

한 변의 길이가 1인 정사각형부터 점점 길이를 1씩 늘려가면서 정사각형이 만들어지는지 확인하는 방법으로 구할 수 있다.

한 변의 길이가 가장 긴 정사각형을 찾으면 답을 구할 수 있다.

 

정사각형의 왼쪽 위 꼭짓점을 기준으로 생각해보자.

위의 그림은 한 변의 길이가 k인 정사각형을 왼쪽 위 꼭짓점을 (i, j)라고 했을 때, 다른 꼭짓점의 좌표를 나타내고 있다.

정사각형을 이루기 위한 조건으로 (i, j), (i, j+k), (i+k, j), (i+k, j+k) 의 값이 모두 같은지 확인하면 된다.

(당연히 i+k와 j+k가 범위를 벗어나지 않아야 한다.)


코드

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] inArr = br.readLine().split(" ");
		int n = Integer.parseInt(inArr[0]);
		int m = Integer.parseInt(inArr[1]);
		int[][] map = new int[n][m];
		for (int i = 0; i < n; i++) {
			String temp = br.readLine();
			for (int j = 0; j < m; j++) {
				map[i][j] = (int) (temp.charAt(j) - '0');
			}
		}
		int max = 1;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				int len = 1;
				int nx = i + len;
				int ny = j + len;
				while (true) {

					if (nx >= n || ny >= m) {
						break;
					}
					if (map[i][j] == map[nx][j] && map[nx][j] == map[i][ny] && map[i][ny] == map[nx][ny]) {
						max = Math.max(max, len + 1);
					}
					len++;
					nx = i + len;
					ny = j + len;

				}
			}
		}
		System.out.println(max * max);
	}

}

결과

 


 

728x90