백준 2028번: 자기복제수

최창효·2022년 1월 12일
0
post-thumbnail

문제 설명

  • 자연수 N을 제곱한 값이 XXXN 모양인지 판별하는 문제입니다.
    • N의 자릿수는 정해져 있지 않습니다.
    • XXX는 임의의 숫자 입니다. XXX의 자릿수 역시 정해져 있지 않습니다.

접근법

  • N을 제곱해야 합니다. 파이썬에서 제곱은 **2입니다. (N = N*N도 제곱입니다)
  • 제곱수의 마지막 len(N)자리 숫자만 가져와야 합니다.
    • 파이썬의 slicing은 음수를 지원합니다. char[-1]은 해당 l문자의 마지막 값을 가져옵니다.
      • char[-k:]를 통해 뒤에서 k개의 문자를 가져올 수 있습니다.

정답

N = int(input())

for _ in range(N):
    num = int(input())
    k = len(str(num)) #주어진 숫자가 몇자리 숫자인지를 확인합니다
    if str(num**2)[-k:] == str(num): #제곱수를 뒤에서 sli만큼만 가져와 num과 동일한지 판단합니다
        print("YES")
    else:
        print("NO")

기타

  • 처음에 제곱수의 맨 뒷자리가 마지막 한 자리를 의미한다고 잘못 생각함
    • 76의 제곱수를 판별할 때 5776이 아니라 5776이면 된다고 오해함
  • 특정 위치의 숫자가 동일한 지를 비교할 때는 문자열로 변환하면 편리함
  • 자기복제수가 기준이 뭘까 궁금해짐
    • 1에서 50,000,000사이의 자기복제수를 구해봄
    • [1, 5, 6, 25, 76, 376, 625, 9376, 90625, 109376, 890625, 2890625, 7109376, 12890625]
    • 1을 제외한 자기복제수는 2576꼴에서만 나타남
    • 자기복제수(X)는 다음과 같이 표현할 수도 있음
    • k가 X의 자릿수(k = len(str(X)), N이 자연수라 할 때 자기복제수 X는 다음이 성립함. X2=X+N10kX^2 = X + N*10^k
      • 이게 특별한 의미나 규칙을 설명하는지는 잘 모르겠음
      • 50,000,000까지의 자기복제수를 봤을 때 수식으로 표현되는 규칙은 없어보임
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글

관련 채용 정보