[문제풀이] 소수 찾기
업데이트:
문제 링크 : 소수 찾기
풀이 시간 : 20분
1. 문제 풀이
조합과 소수를 활용한 문제 풀이
1) 입력으로 만들 수 있는 가장 큰 수를 찾는다(입력을 내림차순 정렬)
2) 가장 큰 수 이하의 소수를 찾는다.(에라토스테네스의 체)
3) 입력으로 만들 수 있는 수 모든 경우를 찾는다(조합)
4) 각 경우가 소수인지 판별 후 HashSet에 넣어서 중복 처리를 해준다.
2. 소스 코드
// 조합에 필요한 visit 배열
static boolean[] v;
// 찾으면 소수 넣은 HashSet
static HashSet<Integer> hs;
// 소수 배열
static boolean[] prime_number;
static public int solution(String numbers) {
int answer = 0;
hs = new HashSet<Integer>();
v = new boolean[numbers.length()];
// 입력 배열의 조합의 최대값
// 소수 배열 크기 정하기 위해서
char[] temp = numbers.toCharArray();
Arrays.sort(temp);
int sum = 0;
for (int i = temp.length-1; i >=0; i--) {
sum = sum*10+(temp[i]-'0');
}
prime_number = new boolean[sum+1];
prime_number[0] = true;
prime_number[1] = true;
// 에라토스테네스의 체를 이용하여 소수 배열
for (int i = 2; i <= Math.sqrt(prime_number.length); i++) {
if(!prime_number[i]) {
for (int j = i+i; j < prime_number.length; j=j+i) {
prime_number[j] = true;
}
}
}
// 조합을 통해 모든 경우의 수 찾기
combi(numbers,0);
// 구한 소수의 갯수
answer = hs.size();
return answer;
}
static void combi(String numbers,int cnt) {
// 소수 판별
if(!prime_number[cnt]) {
hs.add(cnt);
}
// 조합 구하기
for (int i = 0; i < numbers.length(); i++) {
if(!v[i]) {
v[i] = true;
combi(numbers, cnt*10+( numbers.charAt(i)-'0'));
v[i] = false;
}
}
}
3. 후기
단순히 제한 사항의 최대 값만큼 소수를 계속 찾는 것보다(시간 초과 안 뜸)
입력으로 만들 수 있는 최대 값을 구해서 최대 값 이하까지만 구한다