※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1747번 문제인 소수&팰린드롬이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1747
1747번: 소수&팰린드롬
어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다. 어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고,
www.acmicpc.net
자연수 N이 주어질 때, N 이상의 수 중 소수이면서 팰린드롬(회문)인 가장 작은 수를 구하는 문제이다.
회문을 판단하는 것은 길이가 최대 7자리이므로 간단하지만, 각 수가 소수인지 판단하는 것은 그보다 많은 연산을 필요로 하므로, 소수의 목록을 구해놓고 각 수가 회문인지를 판단하는 것이 효율적일 것이다.
100만까지의 소수목록만을 구하면 안됨에 유의하자. (입력으로 100만이 들어오면 100만보다 "큰" 소수이면서 회문인 수를 찾아야하기 때문이다.)
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<bool> sieve(1003002);
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
sieve[0] = sieve[1] = 1;
for (int i = 2; i < 1000; i++) {
if (sieve[i]) continue;
for (int j = i * i; j <= 1003000; j += i) {
sieve[j] = 1;
}
}
int N; cin >> N;
bool chk = 1;
N--;
while (chk) {
N++;
if (!sieve[N]) {
string s = to_string(N);
int slen = s.length();
chk = 0;
int L = 0, R = slen - 1;
while (L < R) {
if (s[L] != s[R]) chk = 1;
L++; R--;
}
}
}
cout << N;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 11378 // C++] 열혈강호 4 (0) | 2021.08.03 |
---|---|
[BOJ 2502 // C++] 떡 먹는 호랑이 (0) | 2021.08.02 |
[BOJ 11401 // C++] 이항 계수 3 (0) | 2021.07.31 |
[BOJ 1072 // C++] 게임 (0) | 2021.07.30 |
[BOJ 10972 // C++] 다음 순열 (0) | 2021.07.29 |