한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
소수를 찾을 때 n만큼 도는 것이 아니라 루트n만큼 돌아도 소수를 찾을 수 있는 방법을 적용함.
import java.util.HashSet;
class Solution {
static boolean[] visited;
static HashSet<Integer> hs = new HashSet<>();
static String[] numbersArr;
public int solution(String numbers) {
int answer = 0;
numbersArr = numbers.split("");
visited = new boolean[numbers.length()];
for (int i = 0; i < numbersArr.length; i++) {
dfs(new StringBuilder(), 0, i);
}
for (Integer h : hs) {
System.out.println("h = " + h);
}
return hs.size();
}
public void dfs(StringBuilder sb, int depth, int index){
//마지막 depth + 1이면 return
if (numbersArr.length == depth) {
return;
}
//sb에 숫자추가
sb.append(numbersArr[index]);
//HashSet에 들어있는지, 소수인지 판별
int curNum = Integer.parseInt(sb.toString());
if(!hs.contains(curNum) && isPrime(curNum)){
hs.add(curNum);
}
//visited 체크
visited[index] = true;
//루프돌며 dfs호출
for (int i = 0; i < numbersArr.length; i++) {
if(visited[i] == false){
dfs(sb, depth + 1, i);
}
}
//함수 나가기 전 visited초기화, sb 초기화
visited[index] = false;
sb.delete(sb.length()-1, sb.length());
}
public boolean isPrime(int number){
boolean flag = true;
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) flag = false;
}
if(number <=1) flag = false;
return flag;
}
}