1 minute read

[BOJ/백준] 1747번 : 소수&팰린드롬

BOJ 1747

Alt text

Alt text

문제 해석

  • 에라토스테네스의 체를 이용해 최대 범위에 해당하는 모든 소수를 구해 놓은 후 이 소수들의 집합에서 N보다 크거나 같으면서 팰린드롬 수인 것을 찾아내면 되는 문제다.
  • 팰린드롬 수 판별 시에 숫자를 char 배열 형태로 구현하여 판별하면 된다고 생각했다.

풀이

  • 첫번째 에라토스테네스의 체를 이용하여 소수를 구한다. 주어진 수 N부터 10000000 사이의 수 중에서 소수들만 배열에 따로 모아놓는다.

  • 그리고 팰린드롬 수인지 판별하는 함수를 만들어서 각 배열을 인덱스로 접근하면서 하나하나 확인해본다.

  • 팰린드롬 수인지 판별하는 함수는 먼저 숫자를 배열의 형태로 구현하고난 뒤, start와 end 포인터 (투포인터)를 이용하여서 두 값을 비교해 같으면 start++, end– 연산으로 두 포인터를 이동시킨다. start < end를 만족할 때까지 반복해 모든 값이 같으면 팰린드롬 수로 판별한다. 아래는 팰린드롬 수 판별하는 함수이다.

bool isPalindrome(int target) {
    string temp_str = to_string(target);//숫자를 문자열로 반환
    int s = 0;
    int e = temp_str.size() - 1;

    while (s < e) {
        //start와 end의 값이 다르면 바로 false 반환
        if (temp_str[s] != temp_str[e]) return false;
        s++;//같다면 start++
        e--;//end--
    }//이상 없이 while문을 빠져나왔으면 팰린드롬 수
    return true;
}

코드

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

bool isPalindrome(int target);

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    long N;
    cin >> N;

    // 동적 배열로 소수 판별 배열 생성
    vector<long> A(10000001, 0);

    // 에라토스테네스의 체 초기화
    for (int i = 2; i < 10000001; i++) {
        A[i] = i;
    }

    for (int i = 2; i <= sqrt(10000001); i++) {
        if (A[i] == 0) continue;
        for (int j = i + i; j < 10000001; j += i) { // i의 배수만 제거
            A[j] = 0;
        }
    }

    // 입력값 N 이상의 소수 중 가장 작은 팰린드롬 수 찾기
    int i = N;

    while (true) {
        if (A[i] != 0) { // 소수일 경우
            int result = A[i];
            if (isPalindrome(result)) { // 팰린드롬 여부 확인
                cout << result << "\n";
                break;
            }
        }
        i++;
    }

    return 0;
}

// 팰린드롬 확인 함수
bool isPalindrome(int target) {
    string temp_str = to_string(target);
    int s = 0;
    int e = temp_str.size() - 1;

    while (s < e) {
        if (temp_str[s] != temp_str[e]) return false;
        s++;
        e--;
    }
    return true;
}