Algorithm

[Algo] 백준 1051 숫자 정사각형 JAVA

조핑구 2024. 5. 8. 13:34

문제 바로가기 : https://www.acmicpc.net/problem/1051

메모리 : 14276KB

시간 : 128ms

언어 : Java 11


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

public class Main {
    static int N, M;
    static int[][] arr;

    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][M];
        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            for (int j = 0; j < M; j++) {
                arr[i][j] = str.charAt(j) - '0';
            }
        }
        int ans = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                // 정사각형인지 검사
                ans = Math.max(ans, sqare(i, j));
            }
        }
        if (ans == 0)
            ans = 1;
        System.out.println(ans);

    }

    private static int sqare(int i, int j) {
        int max = 0;
        for (int k = 1; k < N; k++) {
            if (i + k < N && j + k < M) {
                if (arr[i][j] == arr[i + k][j] && arr[i][j] == arr[i][j + k] && arr[i][j] == arr[i + k][j + k]) {
                    max = Math.max(max, (k + 1) * (k + 1));
                }
            }
        }
        return max;
    }
}

풀이

모든 칸을 돌며 정사각형일때 네 귀퉁이의 숫자가 같은지 확인한다

   private static int sqare(int i, int j) {
        // arr[i][j]에서 시작한 정사각형 중최고값을 찾아야하기 때문에
        int max = 0;
        //1부터 N까지 정사각형을 만들어본다. 정사각형이기때문에 N과 M중에 하나만 고려하면 된다.
        for (int k = 1; k < N; k++) {
            //좌표가 범위 안에 있고
            if (i + k < N && j + k < M) {
                //네 귀퉁이의 숫자가 같으면
                if (arr[i][j] == arr[i + k][j] && arr[i][j] == arr[i][j + k] && arr[i][j] == arr[i + k][j + k]) {
                    //최댓값을 갱신시켜본다.
                    max = Math.max(max, (k + 1) * (k + 1));
                }
            }
        }
        return max;
    }