새소식

PS/백준

[백준/1025] 제곱수 찾기 (Python)

  • -

Problem : https://www.acmicpc.net/problem/1025

 

1025번: 제곱수 찾기

첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지

www.acmicpc.net

 

Difficulty : Gold 5

 

Status : Solved

 

Time : 00:09:28

 


 

문제 설명

 

더보기

N행 M열의 표 A가 있고, 표의 각 칸에는 숫자가 하나씩 적혀있다.

연두는 서로 다른 1개 이상의 칸을 선택하려고 하는데, 행의 번호가 선택한 순서대로 등차수열을 이루고 있어야 하고, 열의 번호도 선택한 순서대로 등차수열을 이루고 있어야 한다. 이렇게 선택한 칸에 적힌 수를 순서대로 이어붙이면 정수를 하나 만들 수 있다.

연두가 만들 수 있는 정수 중에서 가장 큰 완전 제곱수를 구해보자. 완전 제곱수란 어떤 정수를 제곱한 수이다.

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 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)

풀이 완료!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.