코딩문제풀이/Baekjoon

[Java] 백준 3671번 : 산업 스파이의 편지*

코딩하는 포메라니안 2022. 12. 4. 22:19

1. 문제

https://www.acmicpc.net/problem/3671

 

3671번: 산업 스파이의 편지

각 테스트 케이스에 대해 종이조각을 적절히 배치해서 만들 수 있는 서로 다른 소수의 개수를 출력한다. 이때, 모든 종이 조각을 사용하지 않아도 된다. (7과 1이 있을 때, 만들 수 있는 소수는 7,

www.acmicpc.net

 

 

2. 풀이 과정

1. 주어지는 input의 숫자 하나하나를 int[]로 변환한다.

2. 순열을 이용하여 모든 경우의 수를 탐색한다.

3. 집합으로 중복된 값은 소수 판단 여부에서 제외한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Main {
    static Set<Integer> set;
    static int result, len, input[];

    public static void permutation(int order, int num, int visited){
        if(!set.contains(num)){
            set.add(num);
            if(isPrime(num)){result++;}
        }

        //permutation
        for(int i=0; i<len; i++){
            if((visited & (1<<i))!=0){continue;}
            permutation(order*10, num+input[i]*order, visited | (1<<i));
        }

    }

    public static boolean isPrime(int su){
        int limit = (int)Math.sqrt(su);
        if(su <= 1){
            return false;
        }
        for(int i=2; i<=limit; i++){
            if(su%i==0){return false;}
        }
        return true;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        while(T-- > 0){
            String inputs = br.readLine();
            len = inputs.length();
            set = new HashSet<>();
            result = 0;
            input = new int[len];
            for(int i=0; i<len; i++){
                input[i] = inputs.charAt(i) -'0';
            }

            permutation(1, 0, 0);
            sb.append(result+"\n");
        }
        System.out.println(sb.toString());

    }

}

 

결과