프로그래밍 공방

[백준] 1051번 : 숫자 정사각형 본문

개발/문제해결

[백준] 1051번 : 숫자 정사각형

hyosupsong 2020. 11. 11. 22:43

문제

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다.

이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오.

이때, 정사각형은 행 또는 열에 평행해야 한다.


입력

첫째 줄에 N과 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 수가 주어진다.


출력

첫째 줄에 정답 정사각형의 크기를 출력한다.


문제해결방법

직사각형 배열의 원소마다 각 꼭짓점들을 확인하며 최대 길이를 찾는다.


코드


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
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main1051_숫자정사각형 {
    public static char[][] map;
 
    public static boolean checkSquare(int i, int j, int l) {
        if(map[i][j] == map[i+l][j] && map[i][j] == map[i][j+l] && map[i][j] == map[i+l][j+l]) return true;
        return false;
    }
 
    public static void main(String[] args) throws Exception {
        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());
        map = new char[N][M];
        for(int i=0; i<N; i++) {
            String s = br.readLine();
            for(int j=0; j<M; j++) map[i][j] = s.charAt(j);
        }
        int maxLength = Math.max(N, M);
        int curLength = 1;
        loop:for(int l = maxLength; l>0; l--) {
            for(int i=0; i<N-l; i++) {
                for(int j=0; j<M-l; j++) {
                    if(checkSquare(i, j, l)) {
                        curLength = l+1;
                        break loop;
                    }
                }
            }
        }
        System.out.println(curLength*curLength);
    }
}
cs

코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.

'개발 > 문제해결' 카테고리의 다른 글

[백준] 2644번 : 촌수계산  (0) 2020.11.12
[백준] 11725번 : 트리의 부모 찾기  (0) 2020.11.12
[백준] 2579번 : 계단 오르기  (0) 2020.11.10
[백준] 1303번 : 전쟁 - 전투  (0) 2020.11.10
[백준] 1991번 : 트리 순회  (0) 2020.11.10