알고리즘
백준 #1051 - 숫자 정사각형
스히
2024. 3. 13. 20:16
문제
N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.
입력
첫째 줄에 N과 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 수가 주어진다.
출력
첫째 줄에 정답 정사각형의 크기를 출력한다.
예제 입력 1
3 5
42101
22100
22101
예제 출력 1
9
예제 입력 2
2 2
12
34
예제 출력 2
1
예제 입력 3
2 4
1255
3455
예제 출력 3
4
예제 입력 4
1 10
1234567890
예제 출력 4
1
예제 입력 5
11 10
9785409507
2055103694
0861396761
3073207669
1233049493
2300248968
9769239548
7984130001
1670020095
8894239889
4053971072
예제 출력 5
49
우선, n * m 크기의 직사각형을 표현하기 위해 rec이라는 이차원 배열을 만들었다.
그 후, 직사각형의 숫자를 입력받아 rec 배열에 저장했다.
그 후, 왼쪽 위 첫번째 점부터 대각선 아래로 순회하며 검사를 진행했다.
왼쪽 위 모서리를 기준으로, 오른쪽 아래 모서리를 탐색하며
1) 해당 두 모서리가 정사각형을 만드는지
2) 4개의 모서리가 모두 같은 숫자를 나타내는지
위 두 요구사항을 충족하는 정사각형의 모서리를 구하고, max 함수를 통해 가장 넓은 값을 구했다.
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
rec = [[0] * (m) for _ in range(n)] # 직사각형 정보 저장할 이차원 배열
for i in range(n): # 이차원 배열에 직사각형 정보 저장하기
nums = input()
for j in range(m):
rec[i][j] = nums[j]
space = 1 # 조건에 맞는 정사각형이 없을 시, 넓이는 1이므로 초기값 1로 설정
for i in range(n):
for j in range(m): # 왼쪽 위 모서리
left = rec[i][j]
for k in range(i + 1, n):
for l in range(j + 1, m): # 오른쪽 아래 모서리
if (k - i) == (l - j) and rec[k][l] == left and rec[i][l] == left and rec[k][j] == left:
# 정사각형인지, 그리고 4개의 모서리가 다 같은 숫자인지 검사하기
space = max(space, (k - i + 1)**2) # 조건에 맞다면, 최댓값을 넓이로 저장
print(space)