본문 바로가기

백준/실버

[백준 1747번] 소수&팰린드롬 (C++)

문제링크 : 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부터 소수와 팰린드롬이 모두 맞는 수가 나올 떄 까지 값을 찾게 된다.

팰린드롬의 경우 팰린드롬 여부 판별을 쉽게 하기 위해 먼저 현재 수를 문자열로 바꾸게 된다.

이후 문자열의 절반 만큼 반복문을 돌리며 맨 첫번째 수와 맨 끝에 수가 같은지 다른지를 판별해주면 된다.