※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1990번 문제인 소수인팰린드롬이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1990
1990번: 소수인팰린드롬
151은 소수이면서 동시에 팰린드롬이기 때문에 소수인 팰린드롬이다. 팰린드롬이란 앞으로 읽어나 뒤로 읽으나 같은 수를 말한다. 예를 들어 1234는 앞으로 읽으면 1234지만, 뒤로 읽으면 4321이 되
www.acmicpc.net
다음과 같은 관찰을 하자:
1) 짝수자리 팰린드롬 수는 11의 배수이다. 따라서 답의 후보가 될 수 없다.
2) 100000000(1억)은 답이 될 수 없으므로, 이 문제의 답이 될 후보는 최대 7자리의 수일 것이다.
위 관찰에 따라 에라토스테네스의 체를 이용하여 1000만 이하의 소수를 모두 구하고, 주어진 두 수 사이의 수를 탐색하면서 팰린드롬인 소수를 모두 출력하는 것으로 문제를 해결할 수 있다.
탐색범위가 8자리 이상이 들어오는 경우 1000만 미만으로 조정해주는 것을 잊지 말자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<bool> sieve(10000000);
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 2; i < 3162; i++) {
if (sieve[i]) continue;
for (int j = i * i; j < 10000000; j += i) {
sieve[j] = 1;
}
}
int L, R; cin >> L >> R;
R = min(R, 9999999);
for (int i = L; i <= R; i++) {
if (sieve[i]) continue;
string s = to_string(i);
int l = 0, r = s.length() - 1;
bool chk = 1;
while (l < r) {
if (s[l] != s[r]) chk = 0;
l++; r--;
}
if (chk) cout << i << '\n';
}
cout << -1;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 12970 // C++] AB (0) | 2021.08.19 |
---|---|
[BOJ 1956 // C++] 운동 (0) | 2021.08.18 |
[BOJ 1969 // C++] DNA (0) | 2021.08.16 |
[BOJ 20136 // C++] 멀티탭 스케줄링 2 (0) | 2021.08.15 |
[BOJ 1339 // C++] 단어 수학 (0) | 2021.08.14 |