190108 완전탐색 (2) 소수 찾기

2019-01-08

완전탐색 (2) 소수 찾기

문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항
  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers return
17 3
011 2
입출력 예 설명

예제 #1 [1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2 [0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.

풀이 과정
  • (생성할 수 있는 최소값,최대값)범위의 소수목록을 구하고,
  • (생성할 수 있는 모든 숫자)를 구해서 소수목록에 그 숫자가 있으면 answer++
import java.util.*;
public class Permutation{
     public void doCombination(ArrayList<String> t, String[] comb, String[] arr, int n, int r, int index, int target){
        if(r==0){
            doPermutation(t,comb,0);
        }else if(target==n) return;
        else{
            comb[index]=arr[target];
            doCombination(t,comb,arr,n,r-1,index+1,target+1);
            doCombination(t,comb,arr,n,r,index,target+1);
        }
    }
    public void doPermutation(ArrayList<String> t, String[] arr, int startIdx){
        int len=arr.length;
        if(startIdx==len){
            String tmp="";
            for(int i=0;i<arr.length;i++)
                tmp+=arr[i];
            t.add(tmp);
            return;
        }
        for(int i=startIdx;i<len;i++){
            swap(arr,startIdx,i);
            doPermutation(t,arr,startIdx+1);
            swap(arr,startIdx,i);
        }
    }
    public void swap(String[] arr, int n1,int n2){
        String tmp=arr[n1];
        arr[n1]=arr[n2];
        arr[n2]=tmp;
    }
}
class Solution {
        public static ArrayList<Integer> primeList(int start,int end){
        ArrayList<Integer> list=new ArrayList<>();
        for(int i=start;i<=end;i++){
            boolean isPrime=true;
            for(int j=2;j<=(int)Math.sqrt(i);j++){
                if(i%j==0) {
                    isPrime = false;
                    break;
                }
            }
            if(isPrime && i>1)
                list.add(i);
        }

        return list;
        }
    public int solution(String numbers) {
        int answer=0;
        int idx=0;
        Permutation ex=new Permutation();
        String[] s=numbers.split("");

        ArrayList<String> t1=new ArrayList<>();
        ArrayList<Integer> t2=new ArrayList<>();

        for(int i=0;i<s.length;i++){
            String[] comb=new String[i+1];
            ex.doCombination(t1,comb,s,s.length,i+1,0,0);
        }

        for(String tmp:t1)
            t2.add(Integer.parseInt(tmp));

        HashSet h=new HashSet(t2);
        t2.clear();
        t2.addAll(h);
        Collections.sort(t2);
        int size=t2.size();
        int end=t2.get(size-1);
        ArrayList<Integer> pList=primeList(t2.get(0),end);
        for(int i=0;i<size;i++){
            if(pList.indexOf(t2.get(i))!=-1)
                answer++;
        }

        return answer;
    }
}
  • 완전탐색….정말 아이디어 내는방법도 모르겠고 코딩도 힘겹고!!ㅜㅜ