소수 구하기 예제 - 3
문제 분석
에라토스테네스의 체를 이용해 최대 범위에 해당하는 모든 소수를 구해 놓은 후 이 소수들의 집합에서
N보다 크거나 같으면서 팰린드롬인 수를 찾아내면 되는 문제다.팰린드롬 수를 판별할 때 숫자값이 리스트 형태로 적절하게 변환이 가능하다는 점을 이용하면 조금 더 쉽게 로직을 구현할 수 있다.
손으로 풀어보기
2 ~ 10,000,000사이에 모든 소수를 구하고, 그중N보다 크거나 같은 소수에서 팰린드롬 수인지를 판별한다.소수의 값을 리스트 형태로 변환한 후 양끝의 투 포인터를 비교하면 쉽게 팰린드롬 수인지 판별할 수 있다. 해당 소수를 리스트 형태로 변환하고 리스트의 처음과 끝을 가리키는 포인터를 부여해 두 값을 비교한다. 두 값이 같으면
start++,end--연산으로 두 포인터를 이동한다.start < end를 만족할 때까지 반복해 모든 값이 같으면 그 수는 팰린드롬 수다.오름차순으로 과정 2를 실행하다가 최초로 팰린드롬 수가 나오면 프로그램을 종료한다.
슈도코드
n(어떤 수)
A(소수 리스트)
for 2 ~ 10,000,001:
A 리스트 초기화
for A 리스트 길이의 제곱근까지:
소수가 아니면 넘어감
for 소수의 배수 값을 1,000,001까지:
현재 수가 소수가 아니라는 것을 표시
팰린드롬 함수:
숫자값을 리스트 형태로 변환
start(시작 인덱스), end(끝 인덱스)
while start < end:
시작과 끝 인덱스의 해당하는 값이 다르면 return false
start++
end--
반복문을 다 돌면 return true
while true:
N부터 1씩 증가하면서 A[i]값이 소수이면서 팰린드롬 수인지 판별
맞으면 출력 후 반복문 종료코드 구현 - 파이썬
import math
n = int(input())
A = [0] * 10_000_001
for i in range(2, len(A)):
A[i] = i
for i in range(2, int(math.sqrt(len(A)) + 1)):
if A[i] != 0:
for j in range(i * 2, len(A), i):
A[j] = 0
def isPalindrome(target):
temp = list(str(target))
start = 0
end = len(temp) - 1
while start < end:
if temp[start] != temp[end]:
return False
start += 1
end -= 1
return True
index = n
while True:
if A[index] != 0 and isPalindrome(A[index]):
print(A[index])
break
index += 1코드 구현 - 자바
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] A = new int[10_000_001];
for (int i = 2; i < A.length; i++) {
A[i] = i;
}
for (int i = 2; i <= Math.sqrt(A.length); i++) {
if (A[i] != 0) {
for (int j = i * 2; j < A.length; j += i) {
A[j] = 0;
}
}
}
int index = n;
while (true) {
if (A[index] != 0 && isPalindrome(A[index])) {
System.out.println(A[index]);
break;
}
index++;
}
}
private static boolean isPalindrome(int target) {
char[] temp = Integer.toString(target).toCharArray();
int start = 0;
int end = temp.length - 1;
while (start < end) {
if (temp[start] != temp[end]) {
return false;
}
start++;
end--;
}
return true;
}
}Last updated