※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts