한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
numbers는 길이 1 이상 7 이하인 문자열입니다.
numbers는 0~9까지 숫자만으로 이루어져 있습니다.
013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
numbers 17
return 3
numbers 011
return 2
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
11과 011은 같은 숫자로 취급합니다.
import java.util.*;
class Solution {
static Set<Integer> set = new HashSet<>();
int size;
public int solution(String numbers) {
String[] list = numbers.split("");
size = list.length;
for(int i=1; i<=list.length; i++){
doPermutation(list, 0, i);
}
return set.size();
}
//depth
//r : 몇개를 뽑을 것인지?
public void doPermutation(String[] arr, int depth, int r){
if(depth==r){
String result="";
for(int i=0; i<r; i++){
result+=arr[i];
}
int num = Integer.parseInt(result);
if(!set.contains(num)){
if(isPrime(num)){
set.add(num);
}
}
}else{
for(int i=0; i<arr.length; i++){
swap(arr, i, depth);
doPermutation(arr,depth+1,r);
swap(arr, i, depth);
}
}
}
public void swap(String[] arr, int i, int depth){
String tmp = arr[i];
arr[i] = arr[depth];
arr[depth] = tmp;
}
public boolean isPrime(int num){
int sqrt_num = (int)Math.sqrt(num);
boolean flag = true;
if(num==2){
flag=true;
}else if(num%2==0 || num==1){
flag=false;
}else{
for(int i=3; i<=sqrt_num; i+=2){
if(num%i==0){
flag=false;
}
}
}
return flag;
}
}