1 분 소요

📁 [Lv2_42746] 소수 찾기

import java.util.*;
class Solution {
    static HashSet<Integer> set = new HashSet<>();
    static char[] arr;
    static boolean[] v;
    public int solution(String numbers) {
        int answer = 0;

        // 각 문자열 저장
        arr = new char[numbers.length()];
        // 사용여부 저장
        v = new boolean[numbers.length()];

        for(int i=0; i<numbers.length(); i++){
            arr[i] = numbers.charAt(i);
        }

        // 실행
        recursion("", 0);

        // 결과 ( set 크기 )
        answer = set.size();
        return answer;
    }

    // 재귀
    // 가능한 숫자 조합을 찾는다
    // 소수인지 아닌지에 따라 set에 추가
    public void recursion(String str, int idx){
        int num;
        // 기저조건
        // 값이 있으면 체크
        if(str != ""){
            // String을 Integer로 바꿔주기
            num = Integer.parseInt(str);
            // 소수이면 set에 추가
            if(check(num)) set.add(num);
        }

        if(idx == arr.length) return;

        for(int i=0; i<arr.length; i++){
            // 이미 사용한 것이면 통과
            if(v[i]) continue;
            // 사용 처리
            v[i] = true;
            // 재귀
            recursion(str+arr[i], idx+1);
            // 백트래킹
            v[i]=false;
        }
    }

    // 에라토스테네스의 채 활용해서 소수 구하기
    // 소수이면 true, 아니면 false
    public boolean check(int n){
        // 0,1 은 소수가 아니다
        if(n == 0 || n == 1) return false;
        for(int i=2; i<=Math.sqrt(n); i++){
            // 나누어떨어지면 소수가 아니다
            if(n % i == 0) return false;
        }

        // 위에 포함되지 않으면 소수
        return true;
    }
}

🤔 나의 생각

이 문제는 나올수 있는 조합을 다 만들어서 소수인지 아닌지 체크를 하는 것이다.

  • 과정
    • 모든 조합 생성 ( 재귀 사용 )
    • set에 넣어준다 ( 중복을 알아서 제거하므로 ! )
    • 소수를 찾는다 ( 에라토스테네스의 채 활용 )
    • 찾아서 카운팅해준다.


재귀를 이용해 어떻게 모든 조합을 생성할 것인지가 중요한 문제인 것 같다.
소수는 유명한 에라토스테네스의 채를 활용하면 되기 때문에..