문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers return
"17" | 3 |
"011" | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
package LV2;
import java.util.HashSet;
import java.util.Set;
public class H42839 {
public int solution(String numbers) {
int answer = 0; // 소수의 개수를 저장할 변수
Set<Integer> set = new HashSet<>(); // 중복되는 숫자 조합을 제거하기 위해 Set 사용
// 모든 숫자 조합을 생성
permutation("", numbers, set);
// 생성된 모든 숫자 조합에 대해 소수인지 체크
for (Integer number : set) {
// 소수인 경우 answer 증가
if (isPrime(number)) {
answer++;
}
}
// 만들 수 있는 소수의 개수 반환
return answer;
}
// 재귀적으로 모든 숫자 조합을 생성하는 함수
private void permutation(String prefix, String str, Set<Integer> set) {
int n = str.length();
if (!prefix.equals("")) {
set.add(Integer.valueOf(prefix)); // 숫자 조합을 Set에 추가
}
// 재귀적으로 숫자 조합 생성
for (int i = 0; i < n; i++) {
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), set);
}
}
// 숫자가 소수인지 판단하는 함수
private boolean isPrime(int number) {
if (number <= 1) { // 1 이하의 수는 소수가 아님
return false;
}
if (number == 2) { // 2는 소수
return true;
}
// 2부터 number의 제곱근까지 나누어 보면서 소수인지 판별
for (int i = 2; i <= Math.sqrt(number); i++) {
// 나누어 떨어지는 경우 소수가 아님
if (number % i == 0) {
return false;
}
}
// 위의 for loop를 통과하면 소수
return true;
}
}
모든 가능한 숫자의 조합을 만들어보고, 그 조합이 소수인지 아닌지를 판별하는 것으로 해결할 수 있다.
우선, 모든 가능한 숫자의 조합을 만들어내는 것은 순열 알고리즘을 사용하면 해결할 수 있다.
다음으로, 숫자의 조합이 소수인지 아닌지를 판별하는 것은 에라토스테네스의 체 알고리즘을 사용하면 해결할 수 있다.
먼저 permutation 함수는 재귀적으로 주어진 문자열로 가능한 모든 숫자의 조합을 만들어낸다. 그리고 이 숫자들을 **Set**에 넣어 중복을 제거한다.
그 다음 isPrime 함수는 주어진 숫자가 소수인지 판별한다. 2부터 해당 숫자의 제곱근까지 나눠본 결과 나머지가 0인 경우가 없으면 소수로 판별한다.
마지막으로 메인 함수인 **solution**에서는 **Set**에 있는 모든 숫자에 대해 isPrime 함수를 호출하여 소수인 경우 카운트를 증가시킨다. 그리고 이 카운트를 반환하여 주어진 문자열로 만들 수 있는 소수의 개수를 알아낸다.
'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글
124 나라의 숫자 (0) | 2023.06.14 |
---|---|
큰 수 만들기 (0) | 2023.06.14 |
롤케이크 자르기 (0) | 2023.06.12 |
숫자 변환하기 (1) | 2023.06.12 |
뒤에 있는 큰 수 찾기 (0) | 2023.06.12 |