[Algorithm] 기초 문제 / 뒤집은 소수
▶ 문제
N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 수를 출력하는 프로그램을 작성하세요. 예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력 한다. 단 910를 뒤집으면 19로 숫자화 해야 한다. 첫 자리부터의 연속된 0은 무시한다. 뒤집는 함수인 def reverse(x) 와 소수인지를 확인하는 함수 def isPrime(x)를 반드시 작성하 여 프로그래밍 한다.
▶ 입력 설명
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다. 각 자연수의 크기는 100,000를 넘지 않는다.
▶ 출력 설명
첫 줄에 뒤집은 소수를 출력합니다. 출력순서는 입력된 순서대로 출력합니다.
▶ 입력
5
32 55 62 3700 250
▶ 출력
23 73
▷ 내가 짠 코드
import sys
sys.stdin=open("input.txt", "r")
n=int(input())
a = list(map(int, input().split()))
def reverse(x):
s = ''
while x > 0:
s += str(x % 10)
x = x // 10
s = int(s)
return s
def isPrime(x):
for i in range(2, x):
if x % i == 0 :
return False
else:
return True
for i in a:
r = reverse(i)
if isPrime(r) :
print(r, end=' ')
reverse(x) 함수와 isPrime(x) 함수를 차례대로 구현하고 결과를 도출한다는 틀을 제시해 줬기 때문에 하나하나 따라가니 훨씬 수월하게 코드를 작성할 수 있었다.
숫자를 거꾸로 뒤집는 reverse(x) 함수에서는 1의 자리수 부터 순서대로 떼서 문자열로 더해 주었다. 그러면 거꾸로 뒤집힌 문자열이 생성되고, 그걸 다시 정수로 바꾸어 return 해주었다.
숫자가 소수인지 확인하는 isPrime(x) 함수에서는 for 문을 활용해 1과 자기자신 이외의 약수의 유무를 확인하여 True or False를 할당해 주었다.
마지막 for 문에서는 reverse(x)를 한 숫자의 isPrime(x) 값이 True일 경우에만 출력하도록 코드를 짰다.
▷ 예시 코드
import sys
sys.stdin=open("input.txt", "r")
n=int(input())
a=list(map(int, input().split()))
def reverse(x):
res=0
while x>0:
t=x%10
res=res*10+t
x=x//10
return res
def isPrime(x):
if x==1:
return False
for i in range(2, x):
if x%i==0:
return False
return True
for x in a:
tmp=reverse(x)
if isPrime(tmp):
print(tmp, end=' ')
먼저 reverse(x) 함수를 살펴보면, 중간에 문자열로 바꾸지 않고 숫자 그대로 구현한 것을 확인할 수 있다.
21 => 1*10 + 2
198 => 8*100 + 9*10 + 1
이렇게 자리수를 떼어내 10씩을 곱해서 아예 숫자의 형태로 바꾸는 방식이다.
혼자 생각해 내기엔 어려운 논리라 잘 기억해 놓아야 겠다.
다음으로, isPrime(x) 함수의 경우 내가 놓친 부분이 있었다. 바로 x가 1로 들어올 경우이다.
예시 코드에서는 1이 들어올 경우에도 확실하게 False로 구분해 놓은 것을 볼 수 있다. 만약에 입력값 안에 1이 포함돼 있었다면 내 코드는 오답이라고 떴을 것이다.
주어진 입력 조건을 자세히 보고 놓치는 부분이 없도록 주의해야 겠다.