190107 SW Expert Academy(4698) 테네스의 특별한 소수
2019-01-07
4698. 테네스의 특별한 소수
문제 링크
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWRuoqCKkE0DFAXt
풀이
- 에라토스테네스의 체를 이용해 제한범위 내의 소수를 모두 구한다
- a,b 범위 내에서 특별한 소수를 구한다.
- indexOf() 이용
import java.io.*;
import java.util.ArrayList;
public class Main {
public static ArrayList<Integer> getPrime(int start, int end){
// 에라토스테네스의 체 방식으로 소수의 리스트를 얻는다.
// 아래 방식은 필수로 암기할 것!
ArrayList<Integer> list=new ArrayList<>();
for(int i=start;i<=end;i++){
boolean isPrime=true;
for(int j=2;j<=(int)Math.sqrt(i);j++){ // i의 제곱근까지 루프
if(i%j==0){
isPrime=false;
break;
}
}
if(isPrime && i!=1)
list.add(i);
}
return list;
}
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb=new StringBuilder();
int test=Integer.parseInt(br.readLine());
ArrayList<Integer> list=getPrime(1,1000000);
for(int i=0;i<test;i++){
String[] dab=br.readLine().split(" ");
int a=Integer.parseInt(dab[1]);
int b=Integer.parseInt(dab[2]);
int result=0;
for(int l:list){
if(l<a)
continue;
if(l>b)
break;
if(Integer.toString(l).indexOf(dab[0])!=-1)
// 소수가 D를 포함하고 있다면 count
result++;
}
sb.append("#"+(i+1)+" "+result+"\n");
}
System.out.println(sb);
}
}
- 매번 테스트케이스마다 소수리스트를 구했더니 시간초과가 나와서 당황했다 ㅠ
- 제한범위 내의 소수를 모두 구한 다음에 범위 내의 특별한 소수를 구하는 방식으로 변경해서 pass