ALGORITHM/PROGRAMMERS

[프로그래머스] 소수 찾기 (완전탐색)

0298 2021. 7. 28. 15:25

https://programmers.co.kr/learn/courses/30/lessons/42839?language=java 

 

코딩테스트 연습 - 소수 찾기

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

programmers.co.kr

2021-07-28


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.*;
class Solution {
    public static String[] arr;
    public static boolean[] vtd;
    public static int answer;
    public static HashSet<Integer> set;
    static boolean prime(int num) {
        if(num == 0 || num == 1return false;
        for(int i = 2; i <= Math.sqrt(num); i++if(num % i == 0return false;
        return true;
    }
    static void solve(String tmp, int cnt) {
        if(cnt == tmp.length()) {
            int num = Integer.parseInt(tmp);
            if(!set.contains(num)) {
                set.add(num);
                if(prime(num)) answer++;
            }
            return;
        }
 
        for(int i = 0; i < arr.length; i++) {
            if(!vtd[i]) {
                vtd[i] = true;
                solve(tmp + arr[i], cnt);
                solve(tmp + arr[i], cnt+1);
                vtd[i] = false;
            }
        }
    }
    static int solution(String numbers) {
        answer = 0;
        set = new HashSet<>();
        arr = new String[numbers.length()];
        vtd = new boolean[numbers.length()];
        for(int i = 0; i < numbers.length(); i++) arr[i] = String.valueOf(numbers.charAt(i));
 
        solve(""1);
        
        return answer;
    }
 
}
cs

#문제풀이 

사실 재귀에 좀 약한 편이다,,, 깔끔한 구현일지는 모르겠다.

 

hashset으로 중복을 걸렀고, 문자열 하나하나의 조합마다 prime 함수로 소수인지 아닌지 체크했다.