https://www.acmicpc.net/problem/1051
1051번: 숫자 정사각형
N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.
www.acmicpc.net
삼중포문을 돌려서 풀었다. 범위가 작아서 시간초과가 날 고민하지 않았다. 플루이드 와샬 알고리즘과 비슷하게 구현하엿다. 맨 바깥 포문을 한 변의 길이로 잡고 한 변의 길이를 기준으로 나머지 두개의 포문을 돌렸다. 구현만 할 줄 알면 어려운 알고리즘 필요없이 풀 수 있는 문제였다.
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m; //n은 세로, m은 가로
int ans;
int length; //n과 m중 긴 변의 길이
char mat[50][50]; //숫자를 담을 공간
//땅에 정보를 입력
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> mat[i][j];
}
}
if (n < m) { //가로로 긴 경우
length = n - 1; //인덱스가 기준이기 때문에 -1을 해준다.
}
else { //세로로 긴 경우
length = m - 1; //인덱스가 기준이기 때문에 -1을 해준다.
}
//한 변의 길이를 기준으로 모든 구역을 탐색한다.
for (int k = 0; k <= length; k++) {
bool check = false; //flag 변수
for (int i = 0; i < n - k; i++) { //길이가 k인 경우 세로는 n - k - 1 까지만 탐색을 한다.
for (int j = 0; j < m - k; j++) { //길이가 k인 경우 가로는 n - k - 1 까지만 탐색을 한다.
if (mat[i][j] == mat[i][j + k] && mat[i][j] == mat[i + k][j] && mat[i][j] == mat[i + k][j + k]) { //모든 꼭지점의 숫자가 같으면
ans = k + 1; //인덱스에서 +1을 하면 길이가 된다.
check = true; //flag변수를 true변환
break; //탈출
}
}
if (check) { //flag변수가 true면
break; //탈출
}
}
}
cout << ans * ans; //최대 면적을 구한다.
}
'백준' 카테고리의 다른 글
백준17175 - 피보나치는 지겨웡~ (0) | 2019.08.12 |
---|---|
백준7785 - 회사에 있는 사람 (0) | 2019.08.11 |
백준2941 - 크로아티아 알파벳 (0) | 2019.08.09 |
백준1298 - 노트북의 주인을 찾아서 (0) | 2019.08.08 |
백준1620 - 나는야 포켓몬 마스터 이다솜 (0) | 2019.08.07 |