본문 바로가기

백준/실버

[백준 1051번] 숫자 정사각형 (C++)

문제링크 : https://www.acmicpc.net/problem/1051

#include <bits/stdc++.h> 
using namespace std;

int n, m;
int arr[50][50];

int main()
{
	cin >> n >> m;
	string input;
	for (int i = 0; i < n; i++)
	{
		cin >> input;                    //숫자를 한줄로 입력받기에 스트링으로 받음
		for (int j = 0; j < m; j++)
		{
			arr[i][j] = input[j] - '0';  //받은 문자열(숫자)를 하나하나 다시 숫자로 변환
		}
	}

	int k = min(n, m);  //정사각형의 최대 길이 저장

	while (k--)
	{
		for (int i = 0; k + i < n; i++)      //인덱스에 범위 값 설정 (k + i)
		{
			for (int j = 0; k + j < m; j++)  //인덱스에 범위 값 설정 (k + j)
			{
				if (arr[i][j] == arr[i + k][j] &&  //찾는 조건
					arr[i][j] == arr[i][j + k] &&
					arr[i][j] == arr[i + k][j + k])
				{
					cout << (k + 1) * (k + 1);  //넓이 출력
					return 0;                   //while 문에서 가장 큰 값부터 출력하므로 찾으면 바로 종료
				}
			}
		}
	}
	cout << 1;  //못 찾았으면 1 출력 (최소 넓이)
}

for 문에서 인덱스를 이용하여 범위 값 설정을 할 수 있다.

k 값을 작은 값부터 시작하면 큰 값을 계속 갱신해야 하지만 큰 값부터 시작하면 처음 값이 최대 넓이이다.