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

2 minute read

First Attempt

boolean값을 리턴하는 isPresent(int size) 함수를 정의하여, 정사각형의 변의 길이를 인자로 받아서 만약 꼭지점값이 동일한 정사각형이 직사각형 내에 존재하면 true를 리턴하게 하였다.

그리고 main 함수에서는 정사각형의 변의 길이를 max_size부터 시작하여 2가될때 까지 decrement해주면서 isPresent 여부를 확인한다. 여기서 max_size는 정사각형이 가질 수 있는 최대 변의 길이인데, 예를 들어 (N,M) = (3,5) 이면 max_size는 3이된다.

import java.io.*;
import java.util.*;

public class NumberSquare {

	static int N, M;
	static int[][] rect;
	static int max_size;
	
	
	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());
		
		rect = new int[N][M];
		for(int i = 0; i < N; i++) {
			String str = br.readLine();
			for(int j = 0; j < M; j++) {
				rect[i][j] = (int)str.charAt(j) - 48;
			}
		}
		
		max_size = (N > M) ? M : N;
		
		for(int i = max_size; i > 1; i--) {
			if (isPresent(i)) {
				System.out.print(i * i);
				return;
			}
		}
		System.out.print(1);	
	}
	
	public static boolean isPresent(int size) {	
		if(size == max_size) {
			int i = 0, j = 0;
			while(true) {
				if(rect[i][j] == rect[i][size - 1 + j]){
					i += size - 1;
                    if(rect[i][j] == rect[i][size - 1 + j] && rect[i - size + 1][j] == rect[i][j]) return true;
					continue;
				}
				else {
					if(N < M) {
						j++;
						i = 0;
						if(j > M - size) break;
						continue;
					}
					else {
						i++;
						j = 0;
						if(i > N - size) break;
						continue;
					}
				}	
			}
		}
		
		else {
			int i = 0, j = 0;
			while(true) {
				if(j > M - size) {
					i++;
					j = 0;
				}
				if(rect[i][j] == rect[i][size - 1 + j]){
					i += size - 1;
					
					if(i > N) break;
					if(rect[i][j] == rect[i][size - 1 + j] && rect[i - size + 1][j] == rect[i][j]) return true;
					else {
						i -= size - 1;
						j++;
					}
					continue;
				}
				else {
					j++;
					
					if(i > N - size) break;
					continue;
				}
			}
		}
		return false;	
	}
}

적다 보니 코드가 매우 더러워졌다.. 그리고 런타임에러가 난다. max_size를 가지는 꼭지점이 동일한 정사각형이 있으면 최적의 런타임이 겠지만 만약 size가 1인 꼭지점이 동일한 정사각형만 존재한다면 최악의 경우가 발생한다.

또 한가지 실수를 한것이 위 꼭지점 쌍이 서로 같고 아래 꼭지점 쌍이 서로 같으면 되는 걸로 설정했다. 실은 네개의 값이 모두 동일해야 한다.

3중 for문으로 좀 더 직관적으로 코딩하였다.

Second Attempt

import java.io.*;
import java.util.*;

public class NumberSquare {

	static int N, M;
	static int[][] rect;
	
	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());
		
		rect = new int[N][M];
		for(int i = 0; i < N; i++) {
			String str = br.readLine();
			for(int j = 0; j < M; j++) {
				rect[i][j] = (int)str.charAt(j) - 48;
			}
		}
		
		int ans = findMaxSize();
		System.out.print(ans);
	}
	
	public static int findMaxSize() {
		int size = 1;
		int sideLength = Math.min(N, M);
		
		for(int k = sideLength; k > 1; k--) {
			int temp_size = 1;
			for(int i = 0; i < N - k + 1; i++) {
				for(int j = 0; j < M - k + 1; j++) {
					if(rect[i][j] == rect[i][j + k - 1] && 
							rect[i + k - 1][j] == rect[i + k - 1][j + k -1] && rect[i][j] == rect[i + k -1][j]) {
						temp_size = k * k;
					}
				}
			}
			size = Math.max(size, temp_size);
		}
	
		return size;
	}

}

Updated:

Leave a comment