본문 바로가기
알고리즘

[백준 1051- 숫자 정사각형][파이썬]

by Jyujae 2022. 9. 12.

유형: 주어진 크기 안에서 탐색의 범위가 변화하고, 그 범위에서 원하느 조건 처리

브루트포스

https://www.acmicpc.net/problem/1051

문제

 

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

 

--코드

 

--풀이

 

처음에 접근할 때는, 탐색 범위를 따로 for문으로 지정해줬다. r값을 범위로 range(i,i+r) 이런식으로

-> out of range 나옴

그래서 그냥 가로 세로를 쭉 탐색하고, 변하는 크기를 당담해줄 k라는 변수를 만들고, 이 k는 가로 세로 중 작은 값이 max값으로 오게 설정하고 for문을 돌렸다.

그리고 모든 조건을 한번에 설정해주었다.

1. 정사각형을 찾기

if (i+k) <n and (j+k) < m 

가로 세로에 별다른 길이를 통제하는 조건을 걸어두지 않았기 떄문에, out of range, 즉 k를 더하는 과정에서 리스트의 범위를 초과할 수 있다.

data[i][j] == ~~ 구문

각 꼭짓점의 양 끝을 조사하는 조건

 

2. 최대 크기의 정사각형의 크기 구하기

count의 크기를 count와 정사각형의 면적 자체로 지정

-> 즉, 이전 정사각형의 크기가 있을 때, 또다른 정사각형을 발견하면 count = 이전의 정사각형 크기,

k+1 의 제곱은 현 정사각형의 크기가 되고, 이는 더 큰 면적의 정사각형의 크기를 구할 수 있다.