30469 c++ - 호반우가 학교에 지각한 이유 2

2024. 11. 12. 20:43🐣/BOJ

소수찾기 문제의 심화버전이다. 알고리즘 분류는 애드 혹이다.

체를 사용하여 최적해를 구할 수 있도록 하였다.

 

 

c++ 코드

#include <cstring>
#include <iostream>
#include <vector>

using namespace std;
bool prime[100];

void savePrime() {
  memset(prime, true, sizeof(prime));
  prime[0] = prime[1] = false;
  for (int i = 2; i < 100; ++i) {
    if (prime[i]) {
      for (int j = i * i; j < 100; j += i) {
        prime[j] = false;
      }
    }
  }
}

bool checkPrime(int a, int b) {
  int c = a * 10 + b;
  return c >= 10 && c < 100 && prime[c];
}

bool findPrimeSequence(int a, int b, int n, vector<int>& number) {
  number[0] = a / 10;
  number[1] = a % 10;

  for (int i = 2; i < n - 2; ++i) {
    bool found = false;
    for (int d = 1; d <= 9; ++d) {
      if (checkPrime(number[i - 1], d)) {
        number[i] = d;
        found = true;
        break;
      }
    }
    if (!found) return false;
  }

  number[n - 2] = b / 10;
  number[n - 1] = b % 10;

  return checkPrime(number[n - 3], number[n - 2]) &&
         checkPrime(number[n - 2], number[n - 1]);
}

int main() {
  savePrime();

  int a, b, n;
  cin >> a >> b >> n;

  if (!prime[a] || !prime[b]) {
    cout << "-1";
    return 0;
  }

  vector<int> number(n, 0);
  if (findPrimeSequence(a, b, n, number)) {
    for (int digit : number) cout << digit;
  } else {
    cout << "-1";
  }
  return 0;
}

'🐣 > BOJ' 카테고리의 다른 글

1655 c++ - 가운데를 말해요  (0) 2024.11.14
25511 c++ - 값이 k인 트리 노드의 깊이  (0) 2024.11.10
21735 c++ - 눈덩이 굴리기  (0) 2024.11.09
2623 c++ - 음악프로그램  (0) 2024.11.08
2239 c++ - 스도쿠  (0) 2024.10.31