앞으로 읽어도 뒤로 읽어도 똑같은 문자열을 팰린드롬 혹은 회문이라고 부른다. 어떠한 실수 N이 양의 정수이며, 십진수로 표현했을 때 팰린드롬이면 이 수를 팰린드롬 수라고 부른다.
어떠한 양의 정수 N에 대해서, N과 √N이 모두 팰린드롬이면 이 수를 제곱 팰린드롬 수 라고 부른다.
예를 들어, 121은 제곱 팰린드롬 수인데, 121이 팰린드롬이며, 121의 제곱근인 11 역시 팰린드롬이기 때문이다.
A 이상 B 이하 제곱 팰린드롬 수는 모두 몇 개인가?
[입력]
첫 번째 줄에 테스트 케이스의 수 TC가 주어진다. 이후 TC개의 테스트 케이스가 새 줄로 구분되어 주어진다. 각 테스트 케이스의 첫 번째 줄에 A, B 가 주어진다. (1 ≤ A ≤ B ≤ 1000)
[출력]
각 테스트 케이스 마다 한 줄씩, 제곱 팰린드롬 수의 개수를 출력하라.
주어지는 A,B 사이의 수와 그 수의 제곱근이 회문(팰린드롬)인지 검사하는 문제입니다.
파이썬에서 제곱근은 math모듈을 import하여 math.sqrt(n)을 통해서 구할 수 있습니다.
A,B 사이의 수가 1인 경우 무조건 +1을 하며, i의 제곱근이 정수일 경우에 i가 한자리 수라면 +1합니다.
만일 i가 한자리가 아닌 수라면 sqrt한 i와 i가 회문인지를 검사합니다.
이를 검사하는 방법은 각 수를 문자열 형태로 변환한뒤 슬라이싱 기능을 이용합니다.
슬라이싱은 원본 배열 혹은 문자열을 바탕으로 하는 새로운 객체를 생성하여 조건에 따라 원소를 갖습니다.
[::-1]로 슬라이싱할 경우 원본 배열/문자열을 뒤집은 형태가 됩니다.
이를 원본 문자열과 비교하여 회문이면(같으면) +1하게 됩니다.
코드
#SWEA 10570 제곱 팰린드롬 수
import math
T = int(input())
for t in range(T):
answer = 0
a,b = map(int, input().split())
for i in range(a,b+1):
if i == 1: #1은 무조건 누적
answer += 1
continue
sqrt_n = math.sqrt(i)
if sqrt_n%1==0.0: #제곱근이 정수라면
if i<10: #제곱근이 정수일 때 i가 한자리수면 바로 누적
answer += 1
continue
if str(int(sqrt_n)) == str(int(sqrt_n))[::-1]: #회문인지 검사
if str(i) == str(i)[::-1]:
answer += 1
print(f"#{t+1}", answer)
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 숨바꼭질 (백준 1697번 파이썬) (1) | 2023.10.17 |
---|---|
[Python] 소수 찾기(프로그래머스 Lv2 파이썬) (1) | 2023.10.16 |
[Python] 회문1 (SWEA D3 1215번 파이썬) (0) | 2023.10.16 |
[Python] 토마토 (백준 7576번 파이썬) (1) | 2023.10.16 |
[Python] 꽃길 (백준 14620번 파이썬) (1) | 2023.10.15 |