CODING/BAEKJOON
[BAEKJOON] 1051번 숫자 정사각형
snow_white
2022. 2. 8. 11:02
간단하게 생각해보면 이중 for 루프로 좌측 상단 꼭지점을 기준으로 정사각형이 만들어지는지 탐색한다.
하지만 탐색을 위해서는
좌측 상단 꼭지점을 기준으로 오른쪽으로 탐색하여 M-1 인덱스까지 같은 숫자가 있는지, 아래쪽으로 탐색하며 N-1 인덱스까지 같은 숫자가 있는지, 대각선 방향으로 같은 숫자가 있는지 탐색해야 하므로 3중 for 루프를 사용한다.
여기서 고려해야 할 점, 좌측 상단 꼭지점과 같은 거리에 있는 우측 상단 꼭지점, 좌측 하단 꼭지점과 우측 하단 꼭지점의 숫자가 같으면 정사각형을 이루므로 해당 정사각형의 넓이를 구한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
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());
String arr[][] = new String[N][M];
for(int i=0; i<N; i++) {
String str[] = br.readLine().split("");
arr[i] = str;
}
int max = 1;
for(int i=0; i<N-1; i++) {
for(int j=0; j<M-1; j++) {
for(int k=j+1; k<M; k++) {
if((i+(k-j))<N && (j+(k-j))<M && arr[i][j].equals(arr[i][k])
&& arr[i][j].equals(arr[i+(k-j)][j]) && arr[i][j].equals(arr[i+(k-j)][j+(k-j)])) {
if(max < (k-j+1)*(k-j+1))
max = (k-j+1)*(k-j+1);
}
}
}
}
System.out.println(max);
}
}
[출처]
https://www.acmicpc.net/problem/1051
1051번: 숫자 정사각형
N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행
www.acmicpc.net