- INPUT : 연속숫자(0~9)로 이루어진 문자열
- OUTPUT : 주어진 숫자로 조합 가능한 전체 경우 중 소수의 갯수
import java.util.*;
class Solution {
int sols = 0;
Set<Integer> primes = new HashSet<>();
public int solution(String numbers) {
String[] nums = numbers.split("");
boolean[] isUsed = new boolean[nums.length];
for(int i=0;i<isUsed.length;i++){
isUsed[i] = false;
}
for(int i=0;i<nums.length;i++){
boolean[] used = isUsed.clone();
used[i] = true;
findNext(nums[i], nums, used);
}
return sols;
}
하위 노드 탐색 시에 숫자 조합의 순서가 다를 경우 다른 숫자이므로,
다음 노드 선택시 루프를 돌아 전체 경우를 탐색한다.
private void findNext(String combString,String[] numbers,boolean[] isUsed){
int num = Integer.parseInt(combString);
/**/
if(isPrime(num) && !primes.contains(num) ){
sols++;
primes.add(num);
}
for(int i=0;i<numbers.length; i++){ //하위 노드 탐색 시 순서를 고려한다.
if(!isUsed[i]){
boolean[] used = isUsed.clone();
used[i] = true;
String next = combString+numbers[i];
findNext(next, numbers, used);
}
}
}
private boolean isPrime(int num){
if(num==0||num==1 ) return false;
for(int i=2; i*i<=num; i++){
if(num % i == 0) return false;
}
return true;
}
}
반복문의 limit를 Math.sqrt() 메소드를 사용해서 구했었는데, 위에 적어주신 방법이 훨씬 쉬워보이네요