코딩테스트/백준

[백준 1051] 숫자 정사각형 (S3)

34suuuuu 2025. 4. 26. 11:57

📍 문제

https://www.acmicpc.net/problem/1051

📍 문제 풀이

이중 for문을 통해서 배열을 돌면서 size를 줄이는 식으로 진행했다. 

우선 정사각형의 최대 길이는 `n,m`값 중 더 작은 값일 것이다. 이 값을 `size`로 두고 시작한다.

 

이 문제에서 주의해야하는 점은 `size`에 따라서 확인해야하는 배열의 값이었다.

 

예를 들어, 아래의 경우와 같이 `i,j,size`가 각각 0,0,3인 경우를 생각해보자.

`size`가 3이라고 maps[0][3], maps[3][0], maps[3][3]을 확인하는게 아니라

maps[0][2], maps[2][0], maps[2][2]를 확인해야 `size`가 3인 정사각형을 만들 수 있다.

이 점을 주의하면서 확인하는 인덱스의 범위와 값들을 조건에 맞는지 확인하면된다. 

 

`size`를 점차 줄여가면서 만족하는 정사각형이 있는 경우 정사각형의 사이즈를 출력하고 종료한다.

종료할 수 있는 이유는 `size`를 감소시키며 코드를 진행해 가장 먼저 만족하는 값이 최대값이기 때문이다. 

만약 증가하는 방향으로 코드를 진행했다면, 매번 최대값인지 확인하는 과정이 필요하다.

 

📍전체 코드 (Java)

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[][] maps;

	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());

		// 배열 초기화
		maps = new int[n][m];
		for (int i = 0; i < n; i++) {
			String str = br.readLine();
			for (int j = 0; j < m; j++) {
				maps[i][j] = str.charAt(j) - '0';
			}
		}

		int size = Math.min(n, m);
		while (size > 1) {
			for (int i = 0; i <= n - size; i++) {
				for (int j = 0; j <= m - size; j++) {
					if (chkValue(i, j, size)) {
						// 조건에 만족하는 정사각형을 찾았다면 -> 최대값
						System.out.println(size * size);
						return;
					}
				}
			}
            // 해당 size에 대해서 만족하는 정사각형이 없는 경우
			size--;
		}
		System.out.println(size * size);
	}

	private static boolean chkValue(int x, int y, int size) {
		if (x + size - 1 < n && y + size - 1 < m) {
			int v1 = maps[x][y];
			int v2 = maps[x + size - 1][y];
			int v3 = maps[x][y + size - 1];
			int v4 = maps[x + size - 1][y + size - 1];

			if (v1 == v2 && v1 == v3 && v1 == v4) {
				return true;
			}
		}
		return false;
	}
}

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 1251] 단어 나누기 (S5)  (0) 2025.04.30
[백준 21736] 헌내기는 친구가 필요해 (S2)  (0) 2025.04.27
[백준 9625] BABBA (S5)  (0) 2025.04.26
[백준 1380] 귀걸이 (S5)  (1) 2025.04.23
[백준 1010] 다리 놓기 (S5)  (0) 2025.04.22