카테고리 없음

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

daram 2021. 11. 6. 11:37

남들이 작성한 코드를 조금 더 살펴봐야 하는 문제

우아하게 해결한 답변들이 많이 보임.

 

문제 설명

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

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

제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

numbersreturn

"17" 3
"011" 2

입출력 예 설명

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

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

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

 

 

 

import java.util.HashSet;
import java.util.Set;

public class prepareAllSearch2 {
    private static Character[] info;
    private static int numbersLength;
    private static boolean[] visit;
    private static Set<Integer> resultSet = new HashSet<>();

    public static void main(String[] args) {
        String numbers = "011";
//        String numbers = "17";

        numbersLength = numbers.length();
        info = new Character[numbersLength];
        visit = new boolean[numbersLength];

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

        for (int i = 1; i < numbersLength + 1; i++) {
            permutation(0, "", i);
        }

        int answer = 0;
        for (Integer num: resultSet) {
            if (num <= 1) {
                continue;
            }
            if (isPrime(num)) {
                answer++;
            }
        }
        System.out.println(answer);

    }

    private static void permutation(int index, String temp, int end) {
        if (index == end) {
            resultSet.add(Integer.parseInt(temp));
            return;
        }

        for (int i = 0; i < numbersLength; i++) {
            if (!visit[i]) {
                visit[i] = true;
                temp += info[i];
                permutation(index + 1, temp, end);
                visit[i] = false;

                temp = temp.substring(0, temp.length() - 1);
            }
        }
    }

    private static boolean isPrime(int num) {
        boolean isPrime = true;

        for (int i = 2; i < num; i++) {
            if (num % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
}