문제링크 : https://www.acmicpc.net/problem/1747
1747번: 소수&팰린드롬
어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다. 어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고,
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N;
int arr[1003001];
void check() //소수체크
{
memset(arr, 1, sizeof(arr));
arr[1]=0; //1은 소수
for(int i=2; i<=1003001; i++)
{
for(int j=i*2; j<=1003001; j+=i)
{
arr[j] = 0; //소수 아닌 것들 (각 i의 배수들)
}
}
}
bool check_p(int n) //팰린드롬 체크
{
string s = to_string(n);
for(int i=0; i<s.size()/2; i++)
{
if(s[i] != s[s.size()-i-1]) return 0;
}
return 1;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
check();
for(int i=N;; i++)
{
if(!arr[i]) continue; //소수면 스킵
if(check_p(i)) //팰린드롬이면 출력후 종료
{
cout << i << "\n";
break;
}
}
return 0;
}
소수체크와 팰린드롬 체크가 같이 존재하는 문제이다.
먼저 주어진 수의 범위만큼 소수를 체크하고 시작했다.
이때 범위 선택에 주의해야하는데, N의 범위인 백만을 넘는 가장 작은 소수가 1003001이다.
따라서 해당 값 범위에 맞게 소수 값 체크를 해주어야 한다.
N부터 소수와 팰린드롬이 모두 맞는 수가 나올 떄 까지 값을 찾게 된다.
팰린드롬의 경우 팰린드롬 여부 판별을 쉽게 하기 위해 먼저 현재 수를 문자열로 바꾸게 된다.
이후 문자열의 절반 만큼 반복문을 돌리며 맨 첫번째 수와 맨 끝에 수가 같은지 다른지를 판별해주면 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 1312번] 소수 (C++) (0) | 2024.01.24 |
---|---|
[백준 1769번] 3의 배수 (C++) (0) | 2024.01.23 |
[백준 17212번] 달나라 토끼를 위한 구매대금 지불 도우미 (C++) (0) | 2024.01.16 |
[백준 14430번] 자원 캐기 (C++) (0) | 2024.01.11 |
[백준 14606번] 피자 (Small) (C++) (0) | 2024.01.10 |