PS_Baekjoon
[백준 C++] 1051번 : 숫자 정사각형
SMILELY
2023. 4. 2. 11:35
https://www.acmicpc.net/problem/1051
1051번: 숫자 정사각형
N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행
www.acmicpc.net
풀이 :
- n*m 크기의 직사각형 안에서 꼭짓점의 수가 모두 같은 가장 큰 정사각형 찾기
- n의 최대 크기가 50이라서 각 칸 마다 다 돌아도 시간 초과가 나지 않는다
- 한 칸에 도착할 때마다 오른쪽으로 가면서 그 줄에 같은 수가 있는지,
있다면 밑으로 가면서 같은 수가 있는지, 있다면 왼쪽으로 가면서 같은 수가 있는지
이렇게 꼭짓점의 수를 탐색한다
- 전부 같다면 크기를 저장하면서 max값을 갱신한다
- 입력은 한 줄로 주어지기 때문에 string으로 받아서 다시 int형 배열로 바꿔줬다
코드 :
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, m, arr[55][55], ans = 0, cnt;
string s;
cin >> n >> m;
for(int i=0; i<n; i++){
cin >> s; //string으로 받아서
for(int j=1; j<=m; j++){ //int배열로 바꾸는데, 나중에 계산하기 편하도록
arr[i+1][j] = s[j-1]-'0'; //1부터 시작
}
}
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){ //이 칸은 왼쪽 위 꼭짓점
cnt = 0; //매 칸마다 카운트는 초기화
for(int k=j+1; k<=m; k++){ // 오른쪽 위 꼭짓점을 찾을 때까지
cnt++; //cnt 카운트
if(arr[i][j] == arr[i][k]){ //같은 수가 나오면 오른쪽 밑 꼭짓점을 찾을건데,
if(i+cnt <= n && (arr[i+cnt][k] == arr[i][j])){ //m과 n이 같다는 보장이 없기 때문에 앞 조건 필요
if(arr[i+cnt][j] == arr[i][j]){ //마지막 왼쪽 밑 꼭짓점까지 같다면
ans = max(ans, ((cnt+1)*(cnt+1))); //ans에 최댓값을 넣어준다
}
}
}
}
}
}
cout << ans << '\n';
}