티스토리 뷰

www.acmicpc.net/problem/1051

 

1051번: 숫자 정사각형

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는

www.acmicpc.net

밤도 늦고 해서 그냥 쉬운 문제를 하나 풀어보았다. 얼른 자야겠다.

 

문제는 간단하다. 정답률이 왜 낮은지 잘 모르겠다. 아마 string으로 받아야되는데 띄어써서 input 해서 그런거 같다.

주어진 직사각형 숫자 판에서 가장 큰 정사각형의 크기를 구하는 것이다. 여기서 정사각형은 각 꼭지점의 수가 모두 일치하면 된다. 최대 크기는 50 x 50 이다.

 

전체 모든 경우를 다 돌아도 최대 2500 가지이고, 각 점마다 한 줄을 다시 최대 50번 탐색한다. 그리하여 같은 수가 나오면 그 길이만큼 계산하여 정사각형 모양이 되는 위치의 점들을 파악하면 된다. 50^3 이므로 주어진 시간 2초는 넉넉하다. 

 

코드는 다음과 같다.

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	int n, m;
	int res = 1;
	char arr[50][50];

	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		for (int j = 0; j < m; j++)
			arr[i][j] = s[j];
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++) {
			char c = arr[i][j];
			for (int k = 0; k < n; k++) {
				char tmp = arr[k][j];
				if (i == k)
					continue;
				if (c == tmp) {
					int dist = abs(i - k);
					if ((j + dist) >= 0 && (j + dist) < m) {
						if (tmp == arr[k][j + dist])
							if (c == arr[i][j + dist])
								res = max(res, (dist+1) * (dist+1));
					}
					if ((j - dist) >= 0 && (j - dist) < m) {
						if (tmp == arr[k][j - dist])
							if (c == arr[i][j - dist])
								res = max(res, (dist+1) * (dist+1));
					}
				}
			}
		}
	}

	cout << res;
}

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 2437 저울 C++  (0) 2021.01.06
백준 / 17144 미세먼지 안녕! C++  (0) 2021.01.02
백준 / BOJ / 1963 소수 경로 C++  (2) 2020.12.26
백준 / BOJ / 7579 앱 C++  (0) 2020.12.20
백준 / BOJ / 15683 감시 C++  (0) 2020.12.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함