본문 바로가기

ALGORITHM

백준 1051 숫자 정사각형 (Java)

1. 문제 링크

 

1051번: 숫자 정사각형

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

정사각형의 꼭짓점 숫자 중 가장 큰 정사각형을 찾는 문제이다.

 N과 M 중 작은 값부터 정사각형을 만들수 있어서 이중포문을 정사각형 크기만큼씩 돈다.

네 꼭짓점이 모두 같으면 true를 리턴해서 라벨이 있는 out에서 나간다.

정사각형 크기를 줄이면서 도는데 크기가 0이 되면 종료한다.

 

4. 코드

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

public class Main {
	static int map[][], N, M;
    public static void main(String[] args) throws IOException{
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       StringBuilder sb = new StringBuilder();
       String[] split = br.readLine().split(" ");
       N = Integer.parseInt(split[0]);
       M = Integer.parseInt(split[1]);
       map = new int[N][M];
       for(int i=0;i<N;i++) {
    	   map[i] = Arrays.stream(br.readLine().split("")).mapToInt(Integer::parseInt).toArray();
       }
       //정사각형의 꼭짓점에 쓰여 있는 숫자가 모두 같은 가장 큰 정사각형 찾기
       int size = Math.min(N, M); 
       
       out:
       while(true) {
    	   for(int i=0;i<N-size;i++) {
    		   for(int j=0;j<M-size;j++) {
    			   if(check(i, j, size)) {
    				   break out;
    			   }
    		   }
    	   }
    	   
    	   size--;
    	   if(size == 0) {
    		   break;
    	   }
       }
      
       if(size == 0) {
    	   System.out.println(1);
       }
       else {
    	   size++;
    	   System.out.println(size*size);
       }
	}

	private static boolean check(int i, int j, int size) {
		if(map[i][j] == map[i+size][j] 
		&& map[i][j+size] == map[i+size][j+size] 
		&& map[i][j] == map[i][j+size]){
			return true;
		}
		return false;
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 9328 열쇠 (Java)  (0) 2023.04.11
백준 1743 음식물 피하기 (Java)  (0) 2023.04.11
백준 10282 해킹 (Java)  (0) 2023.04.09
백준 1913 달팽이 (Java)  (0) 2023.04.08
백준 9012 괄호 (Java)  (0) 2023.04.07