Algorithm/Simulation

[Python] SWEA 10570번 제곱 팰린드롬 수

코딩쪼앙 2023. 5. 8. 15:56

문제

  • 숫자의 범위가 주어질 때 그 숫자와, 그 숫자의 제곱수가 모두 팰린드롬인 수의 개수 구하기

나의 풀이

  • 숫자의 범위까지 하나씩 탐색하면서 그 숫자가 팰린드롬일 경우 그 숫자의 제곱수 또한 팰린드롬인지 체크한 후, 팰린드롬인 경우 카운트

코드

import math
n = int(input())
for tc in range(n):
    a,b = map(int,input().split())
    cnt = 0
    for i in range(a, b + 1):
        # 두 자리수 넘을 때 앞 뒤 팰린드롬인지 확인
        str_i = str(i)
        palindrome = True
        str_len = len(str_i)
        if str_len == 1:
            palindrome = True

        elif str_len >= 2:
            for j in range(str_len // 2):
                if str_i[j] != str_i[str_len - j - 1]:
                    palindrome = False
                    break

        # 제곱수도 팰린드롬인지 검사
        check = True
        if palindrome:
            pal_str = math.sqrt(i)
            if int(pal_str) == pal_str:
                pal_str = str(int(pal_str))
                if len(pal_str) == 1:
                    check = True

                elif len(pal_str) >= 2:
                    for j in range(len(pal_str) // 2):
                        if pal_str[j] != pal_str[len(str(int(pal_str))) - j - 1]:
                            check = False
                            break
            else:
                check = False

        if palindrome and check:
            cnt += 1

    print(f'#{tc + 1}', cnt)

다른 사람의 풀이

  • 숫자 범위를 모두 탐색하면서 제곱수가 정수인 경우 골라내기
  • 제곱수가 정수인 경우 문자열을 뒤집어 뒤집지 않은 문자열과 같은지 확인 -> 간단하게 팰린드롬 확인 가능
  • 제곱하지 않은 문자열이 팰린드롬인 경우, 제곱 한 수 또한 팰린드롬인지 체크하고 모두 팰린드롬이 맞다면 카운트 

코드

import math

n = int(input())
for tc in range(n):
    a,b = map(int,input().split())
    cnt = 0
    for i in range(a, b + 1):
        c = math.sqrt(i)
        if c == int(c):
            i = str(i)
            c = str(int(c))
            if i == i[::-1] and c == c[::-1]:
                cnt += 1
    print(f'#{tc + 1}',cnt)