CS & Algorithm
[백준 / Java] 1051번: 숫자 정사각형 (브루트포스 알고리즘)
whatdoyumin
2025. 2. 4. 15:14
코테99 11일차 문제는 백준 1051번 '숫자 정사각형'이다.
이번 문제도 완전 탐색 (브루트포스) 알고리즘을 활용하는 문제였다.
접근 방법
- 꼭짓점에에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는다.
- 정사각형은 행 또는 열에 평행해야 한다.
알고리즘 진행 순서
- 입력된 값을 배열에 넣는다.
- 전체(N*M)를 도는데, 가능한 최대 정사각형 크기 안에서 반복하여 최대 정사각형을 구한다.
- 최대 정사각형을 출력한다.
구현 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] arr;
static int N, M = 0;
// 최소 정사각형 크기 => 이후 최대값을 넣을 것.
static int maxSize = 1;
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 line = br.readLine();
for (int j = 0; j < M; j++) {
arr[i][j] = line.charAt(j) - '0';
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// 가능한 최대 정사각형 크기
int maxLength = Math.min(N - i, M - j);
for (int k = 1; k < maxLength; k++) { // k는 현재 변의 길이, 점점 늘리면서 다 살펴보기
if (arr[i][j] == arr[i + k][j] && arr[i][j] == arr[i][j + k] && arr[i][j] == arr[i + k][j + k]) {
maxSize = Math.max(maxSize, (k + 1) * (k + 1)); // 최대 값을 집어 넣기
}
}
}
}
System.out.println(maxSize);
}
}
회고
- 처음에 브루트포스 구현에 익숙하지 않아서 단순히 생각하지 않고 한 줄에서 중복을 찾고 거리와 값을 저장하려고 했다.
- 최소 정사각형 크기와 최대 정사각형 크기를 기준으로 하는 것을 생각하지 못했다. 연습이 많이 필요할 것 같다.