관리 메뉴

Mini

[틀림] 백준 2023 신기한소수 //dfs, 소수판별 알고리즘, 안되는경우(1천만) 본문

Algorithm/수학

[틀림] 백준 2023 신기한소수 //dfs, 소수판별 알고리즘, 안되는경우(1천만)

Mini_96 2025. 3. 26. 00:12

https://www.acmicpc.net/problem/2023

* 시도1

  • 자릿수에따라 for문?
  • 단점
    • substr의 비용, 복잡도 
    • sosu 배열은 1000만 넘어가면 메모리초과

 

* 풀이

  • n=8 -> 작네? -> dfs 완탐?
  • sosu배열? -> 1000만 초과 불가 -> check 함수로 그때그떄 확인

#include<bits/stdc++.h>
using namespace std; 

typedef long long ll;

int n,k,ret;

int check(int num) {
   if(num<=1) return 0;
   if(num==2) return 1;
   if(num%2==0) return 0;
   for(int i=2;i*i<=num;i++) {
      if(num%i==0) return 0;
   }

   return 1;
   
}

void dfs(int level, int num) {
   if(level==n) {
      if(check(num))
         cout<<num<<"\n";
      return;
   }
   if(!check(num)) {
      return;
   }

   for(int i=0;i<=9;++i) {
      dfs(level+1,num*10+i);
   }
}



int main() {
   ios_base::sync_with_stdio(0);
   cin.tie(0); cout.tie(0);

   cin>>n;

   // fill(sosu, sosu + 100000000, 1); // 모두 소수라고 가정!
   // sosu[0]=0; sosu[1]=0; //0, 1은 소수 아님
   // for(int i=2;i*i<=99999999;++i) {
   //    if(!sosu[i]) continue;
   //    for(int j=i*i;j<=99999999;j+=i) { //i의 배수는 소수가 아님.
   //       sosu[j]=0;
   //    }
   // }

   //첫숫자는 0이될수없음
   for(int i=1;i<=9;++i) {
      dfs(1,i);
   }
   return 0;
}

 

  • 추가최적화
    • 사실뒤에 홀수만 붙일수있음
    • 짝수를 붙이는경우는 무조건 소수가아님 -> 탐색할필요도 없음