문제
어떤 자연수 N을 제곱했을 때, 그 제곱수의 맨 뒷자리에 원래의 수 N이 다시 나타나면, 우리는 그 수 N을 자기복제수라고 한다.
예를 들면, 5의 제곱은 52는 25이고 25의 맨 뒷자리에 원래의 수 5가 나타나므로 5는 자기복제수이다. 또 다른 예로, 76의 제곱은 5776이고 5776의 맨 뒷자리에 76이 나타나므로 76 또한 자기복제수이다.
자연수 N이 주어졌을 때, 그 수가 자기복제수인지 아닌지를 알아내는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/2028
입력
입력의 첫 줄에는 테스트 케이스의 개수 T (1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 자연수 N (1 ≤ N ≤ 1000)이 주어진다.
출력
각 테스트 케이스에 대해, 주어진 자연수가 자기복제수이면 YES를 아니면 NO를 출력한다.
예제
# input
4
1
6
76
89
# output
YES
YES
YES
NO
문제 풀이
import sys
input = sys.stdin.readline
N = int(input())
for _ in range(N):
num = int(input())
length = len(str(num))
print('YES' if str(num) == str(num**2)[-length:] else 'NO')
사용된 개념 및 배운 점
1.문자열 슬라이싱을 활용한 숫자의 뒤 비교
num과 num ** 2의 뒷자리 숫자 일치 여부를 비교하기 위해 문자열로 변환하고, [-length:]를 활용해 자릿수만큼 슬라이싱함.
예를 들어 num = 76인 경우 str(num**2)[-2:]은 '76'으로, 자기복제 여부를 손쉽게 확인할 수 있음.
숫자 비교를 문자열 기반으로 처리함으로써 자릿수에 관계없이 간결하고 직관적인 코드를 작성할 수 있었음.
2. 삼항 연산자를 활용한 출력 처리
print('YES' if 조건 else 'NO')와 같이 조건문을 간단하게 표현하는 삼항 연산자를 사용해 가독성을 높였음.
한 줄로 로직과 출력까지 처리 가능하다는 점에서 간단한 문제 풀이에 효과적임.
파이썬을 독학하시는 분들에게 도움이 되길 바라며,
혹 더 좋은 방법이 있거나 오류가 있다면 편하게 말씀 부탁드립니다.