문제 풀이/백준
[백준] 5636번. 소수 부분 문자열(JAVA)
27200
2025. 3. 1. 14:39
문제
https://www.acmicpc.net/problem/5636
풀이(17분)
import java.io.*;
import java.util.*;
public class Main {
static boolean[] isPrime = new boolean[100001];
static List<Integer> primeList = new ArrayList<>();
public static void isPrime(){ // 100,000까지의 소수 먼저 확인
Arrays.fill(isPrime, true);
isPrime[0] = false;
isPrime[1] = false;
for(long i = 2; i < 100001; i++){
if(isPrime[(int)i]){
primeList.add((int)i);
for(long j = i * i; j < 100001; j += i){
isPrime[(int)j] = false;
}
}
}
Collections.sort(primeList, Comparator.reverseOrder()); // 소수 역순 정렬
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
isPrime();
String testCase = br.readLine();
while(!testCase.equals("0")){ // 0이 아닌 입력이라면
for(int i = 0; i < primeList.size(); i++){ // 큰 소수부터 확인
if(testCase.contains(primeList.get(i).toString())){
System.out.println(primeList.get(i));
break;
}
}
testCase = br.readLine();
}
}
}
문제 풀이 전략
초기에 255자리의 문자열에 대해 어떻게 처리해야 하나 고민하다가 100,000까지만 소수로 확인한다는 것을 보고 판단했다.
에라토스테네스의 체를 활용하여 먼저 모든 소수를 구해두고, 역순으로 정렬한 뒤 포함관계를 살펴보자!
https://to-travel-coding.tistory.com/83 에라토스테네스의 체를 모르면 참고하자.
물론 100000까지라고 하면 너무 많은 소수가 저장될 것 같지만 9592개가 저장된다는 것을 보고 가능하다고 판단하여 진행했다.