백준 [1050] "숫자 정사각형"

Kimbab1004·2024년 10월 8일
0

Algorithm

목록 보기
99/102

문제를 제대로 이해하지 못해 시간이 오래 걸렸다. 사각형의 넓이는 두 꼭짓점의 좌표를 각각빼주면 된다고 생각했지만 두 꼭짓점을 제외한 나머지 두개의 꼭짓점에도 똑같은 숫자가 있어야 사각형이 된다는 것을 뒤늦게 생각해 이에 맞게 변경하였지만 맨 뒤에 정사각형이라는 조건이 붙은걸 또 뒤늦게 확인해 문제 풀이에 애를 먹었다.

왼쪽 상단부터 숫자를 solve 함수에 넣어 같은 x축 , y축에 현재 숫자가 있다면 이를 vector에 집어넣고 나중에 x축 y축 백터에서 값을 하나씩 완전탐색해 맨 마지막 꼭짓점에 현재 숫자가 있는지를 검사하고 이에 대한 넓이를 구하고 최대값을 갱신하는 방식으로 해결했다.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

int n, m;
int map[60][60];

int result = 1;


void solve(int cur, int x, int y) {
	//꼭짓점은 4개여야함

	//one은 i값은 min j값은 min
	//two는 i값은 min j값은 max
	//three i값은 max j값은 min
	//four  i값은 max j값은 max
	//42101 
	//22100
	//22101

	vector<int> x_list;
	vector<int> y_list;

	for (int i = x; i < n; i++) {
		if (map[i][y] == cur) x_list.push_back(i);
	}

	for (int j = y; j < m; j++) {
		if (map[x][j] == cur) y_list.push_back(j);
	}

	for (int i = 0; i < x_list.size(); i++) {
		for (int j = 0; j < y_list.size(); j++) {
			if (cur == 5) {
				//cout << x_list[i] << " " << y_list[j] << endl;
			}
			int cur_x = x_list[i];
			int cur_y = y_list[j];

			if ((cur_x - x) != (cur_y - y)) continue;

			if (map[cur_x][cur_y] == cur) {
				//cout << "정답" << cur_x << " " << cur_y << endl;
				//점은 4개여야 함
				if (x == cur_x || y == cur_y) continue;

				int k = ((cur_x - x) + 1) * ((cur_y - y) + 1);
				result = max(result, k);
			}

		}
	}

}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		for (int j = 0; j < s.size(); j++) {
			map[i][j] = s[j] - '0';
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			//아직 방문한 적이 없는 숫자면 진행
			solve(map[i][j],i,j);
		}
	}

	cout << result;

	return 0;
}

0개의 댓글