끼얏호 한 번 틀리고 오답 후 바로 맞았다 !@!
import sys
input = sys.stdin.readline
n = int(input())
maximum = 1003003
che = [False, False] + [True]*(maximum)
def palindrome(answer):
for k in range(len(answer)//2):
if answer[k] != answer[len(answer)-k-1]:
return False
return True
primes = []
for i in range(2, maximum):
if che[i]:
if i >= n:
primes.append(i)
for j in range(2*i, maximum, i):
che[j] = False
for i in primes:
if palindrome(str(i)):
print(i)
exit()
뭔가 다소 복잡해보이나 ㅎㅎ... 응 뭐 일단 맞음 ㅎㅎ
풀이 방법은 다음과 같다.
palindrome 함수
: 소수를 받아 이 숫자가 팰린드롬인지를 알아보는 것이다. 이 부분은 쉽게 구현할수 있을텐데, 팰린드롬이 아닐 때 바로 빠져나오는 것 등을 구현하기 위해 함수로 구현했다.첫번째 for문
: 이 부분은 소수인지를 빠르게 확인할 수 있는 에라토스테네스의 체를 사용했다. 나중에 팰린드롬 확인을 할 때 불필요한 연산은 줄이기 위해 i
가 n
보다 크다는 조건문을 넣어주었다. 다들 알겠지만 무조건 2부터 시작해야한다! 그래야지 배수를 걸러낼 수 있을텡께 ... (응 내 이야기 ...)두번째 for문
: 그리고는 들어온 숫자들을 팰린드롬인지 확인을 해주고, 팰린드롬이라면 출력 후 코드를 종료하게 된다. exit ... 꽤나 요긴하게 써먹는다.처음에 틀렸던 이유는 경곗값을 고려해주지 않아서였다.
N
이 1,000,000까지 들어온다고 하여 에라토스테네스의 체를 단순히 1,000,001까지 했다가 낭패를 보았다. 그래서 아예 maximum
, 즉 체의 최댓값을 아주 크게 늘린 후 (1,500,000) 정답값 (1,003,001) 을 확인 후 그에 맞게 maximum
값을 조정해주었다.
import math
def isPrime(x): # 소수인지 판별해주는 함수
for i in range(2, int(math.sqrt(x)+1)):
if x % i == 0:
return False
return True
N = int(input())
result = 0
for i in range(N, 1000001): # 입력값 N 부터 최대값 까지 순환
if i == 1: # 1은 소수가 아니기 때문에 예외처리
continue
if str(i) == str(i)[::-1]: # 팰림드롬 수 일 경우
if isPrime(i) == True: # 소수 판별 함수 적용
result = i
break
if result == 0: # 입력값이 만약 최대 값 100만일 경우
result = 1003001 # 100만 이상이면서 팰림드롬 및 소수일 경우를 적용
print(result)
이 분은 슬라이싱을 통해 팰린드롬을 확인해주었다. 오호 ... 다음부터는 비슷한 유형이 나오면 저런 방법을 써보아야겠다!
슬슬 ... 다른 알고리즘으로 넘어가볼까 생각 중이다.
아마 다음 알고리즘은 그리디 알고리즘이 되지 않을까 ~~~