카테고리 없음
[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;
}
}