첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지고, 공백없이 모두 붙여져 있다.
출력
첫째 줄에 연두가 만들 수 있는 가장 큰 완전 제곱수를 출력한다. 만약, 완전 제곱수를 만들 수 없는 경우에는 -1을 출력한다.
1 ≤ N, M ≤ 9
표에 적힌 숫자는 0보다 크거나 같고, 9보다 작거나 같다.
입력 예시
2 3
123
456
출력 예시
64
풀이
브루트포스로 풀이 가능하다.
시작 행, 시작 열, 행 공차, 열 공차를 선정하는 경우의 수는 약 4*N^2*M^2이 된다. (공차 둘이 모두 0인 경우는 제외하자)
등차수열에 따라 방문하며 이어붙인 글자가 완전제곱수인 경우에 업데이트를 시도하면 된다. 완전제곱수 판별은 int(sqrt(N))^2 == N인지를 판단하면 된다(완전제곱수라면 제곱근이 정수이고, 그 제곱이 원래 수와 같아야 한다)
풀이 코드
import sys
input = sys.stdin.readline
ans = -1
N, M = map(int, input().split())
maps = [input().strip() for _ in range(N)]
for i in range(N) :
for j in range(M) :
for k in range(-N, N) :
for l in range(-M, M) :
if not k and not l :
continue
_i, _j, tmp = i, j, ''
while -1 < _i < N and -1 < _j < M :
tmp += maps[_i][_j]
if int(int(tmp) ** 0.5) ** 2 == int(tmp) :
ans = max(ans, int(tmp))
_i += k
_j += l
print(ans)