알고리즘 연습/브루트 포스

[🥈3 / 백준 1051 / 파이썬] 숫자 정사각형

김세진 2021. 12. 9. 22:22
반응형

 

 

1051번: 숫자 정사각형

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

www.acmicpc.net

 

문제

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












 

풀이

 

모든 좌표를 탐색하며 해당 칸부터 변의 길이를 쭉 늘려나가며 정사각형을 찾는다.

네 꼭짓점이 서로 일치해야 하므로 if문 대신 편리하게 set형을 사용했다.

 

import sys
input = sys.stdin.readline

n,m = map(int,input().split())
board = [list(input().rstrip()) for _ in range(n)]
max_size = 1
for i in range(n):
    for j in range(m):
        for k in range(max_size,50):
            if n<=i+k or m<=j+k:
                break
            if len(set([board[i][j],board[i+k][j],board[i][j+k],board[i+k][j+k]])) == 1:
                max_size = max(max_size,k+1)
print(max_size**2)
반응형