1025번: 제곱수 찾기
첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지
www.acmicpc.net
문제
N행 M열의 표 A가 있고, 표의 각 칸에는 숫자가 하나씩 적혀있다.
연두는 서로 다른 1개 이상의 칸을 선택하려고 하는데, 행의 번호가 선택한 순서대로 등차수열을 이루고 있어야 하고, 열의 번호도 선택한 순서대로 등차수열을 이루고 있어야 한다. 이렇게 선택한 칸에 적힌 수를 순서대로 이어붙이면 정수를 하나 만들 수 있다.
연두가 만들 수 있는 정수 중에서 가장 큰 완전 제곱수를 구해보자. 완전 제곱수란 어떤 정수를 제곱한 수이다.
입력
첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지고, 공백없이 모두 붙여져 있다.
출력
첫째 줄에 연두가 만들 수 있는 가장 큰 완전 제곱수를 출력한다. 만약, 완전 제곱수를 만들 수 없는 경우에는 -1을 출력한다.
출력
- 1 ≤ N, M ≤ 9
- 표에 적힌 숫자는 0보다 크거나 같고, 9보다 작거나 같다.
코드
from math import sqrt
n, m = map(int, input().split())
board = [input() for _ in range(n)]
ans = -1
for r in range(n): # 행
for c in range(m): # 열
for i in range(-n+1, n): # 행의 공차
for j in range(-m+1, m): # 열의 공차
if i == 0 and j == 0:
if float.is_integer(sqrt(int(board[r][c]))):
ans = max(ans, int(board[r][c]))
else:
rr, cc = r, c
tmp = ''
while True:
if 0 <= rr < n and 0 <= cc < m:
tmp += board[rr][cc]
if float.is_integer(sqrt(int(tmp))):
ans = max(ans, int(tmp))
rr += i
cc += j
else:
break
print(ans)
각 칸에서 가능한 모든 경우의 수를 다 계산해봤다. 예를 들어, (0, 0)에서 행 0, 열 1로 가능한 경우, 행 0 열 2로 가능 한 경우, ..., 행 1, 열 2로 가능한 경우,....를 각 칸에서 모두 계산했다.
N과 M이 최대 9까지만 입력되므로 이렇게 BruteForce로 풀이할 수 있었다.
'문제풀이 > 완전탐색' 카테고리의 다른 글
[Python/파이썬] 백준 5883번 아이폰 9S (0) | 2024.02.06 |
---|---|
[Python/파이썬] 백준 15970번 화살표 그리기 (1) | 2024.02.03 |
[Python/파이썬] 백준 16439번 치킨치킨치킨 (0) | 2023.04.27 |
[Python/파이썬] 백준 5568번 카드 놓기 (0) | 2023.04.27 |
[Python/파이썬] 백준 1969번 DNA (0) | 2023.04.27 |
1025번: 제곱수 찾기
첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지
www.acmicpc.net
문제
N행 M열의 표 A가 있고, 표의 각 칸에는 숫자가 하나씩 적혀있다.
연두는 서로 다른 1개 이상의 칸을 선택하려고 하는데, 행의 번호가 선택한 순서대로 등차수열을 이루고 있어야 하고, 열의 번호도 선택한 순서대로 등차수열을 이루고 있어야 한다. 이렇게 선택한 칸에 적힌 수를 순서대로 이어붙이면 정수를 하나 만들 수 있다.
연두가 만들 수 있는 정수 중에서 가장 큰 완전 제곱수를 구해보자. 완전 제곱수란 어떤 정수를 제곱한 수이다.
입력
첫째 줄에 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 표에 적힌 숫자가 1번 행부터 N번 행까지 순서대로 한 줄에 한 행씩 주어진다. 한 행에 적힌 숫자는 1번 열부터 M번 열까지 순서대로 주어지고, 공백없이 모두 붙여져 있다.
출력
첫째 줄에 연두가 만들 수 있는 가장 큰 완전 제곱수를 출력한다. 만약, 완전 제곱수를 만들 수 없는 경우에는 -1을 출력한다.
출력
- 1 ≤ N, M ≤ 9
- 표에 적힌 숫자는 0보다 크거나 같고, 9보다 작거나 같다.
코드
from math import sqrt n, m = map(int, input().split()) board = [input() for _ in range(n)] ans = -1 for r in range(n): # 행 for c in range(m): # 열 for i in range(-n+1, n): # 행의 공차 for j in range(-m+1, m): # 열의 공차 if i == 0 and j == 0: if float.is_integer(sqrt(int(board[r][c]))): ans = max(ans, int(board[r][c])) else: rr, cc = r, c tmp = '' while True: if 0 <= rr < n and 0 <= cc < m: tmp += board[rr][cc] if float.is_integer(sqrt(int(tmp))): ans = max(ans, int(tmp)) rr += i cc += j else: break print(ans)
각 칸에서 가능한 모든 경우의 수를 다 계산해봤다. 예를 들어, (0, 0)에서 행 0, 열 1로 가능한 경우, 행 0 열 2로 가능 한 경우, ..., 행 1, 열 2로 가능한 경우,....를 각 칸에서 모두 계산했다.
N과 M이 최대 9까지만 입력되므로 이렇게 BruteForce로 풀이할 수 있었다.
'문제풀이 > 완전탐색' 카테고리의 다른 글
[Python/파이썬] 백준 5883번 아이폰 9S (0) | 2024.02.06 |
---|---|
[Python/파이썬] 백준 15970번 화살표 그리기 (1) | 2024.02.03 |
[Python/파이썬] 백준 16439번 치킨치킨치킨 (0) | 2023.04.27 |
[Python/파이썬] 백준 5568번 카드 놓기 (0) | 2023.04.27 |
[Python/파이썬] 백준 1969번 DNA (0) | 2023.04.27 |