gimmickbutreal
[프로그래머스/자바] 소수찾기 - DFS 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42839
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
44
45
46
47
48
49
50
51
52
53
54
55
|
import java.util.*;
public class Solution {
// 주어진 문자열에 포함된 숫자들로 만들 수 있는 소수의 개수를 반환하는 메서드
public int solution(String numbers) {
// 소수를 찾는 메서드를 호출하고 결과 집합의 크기를 반환
Set<Integer> primeNumbers = findPrimeNumbers(numbers);
return primeNumbers.size();
}
// 주어진 문자열에 포함된 숫자들로 만들 수 있는 소수를 찾아 집합에 저장하는 메서드
private Set<Integer> findPrimeNumbers(String numbers) {
// 소수를 저장할 HashSet 생성
Set<Integer> primeNumbers = new HashSet<>();
// 순열을 구하고 소수인 경우 집합에 추가
permutation("", numbers, primeNumbers);
return primeNumbers;
}
// 주어진 문자열의 순열을 구하고, 해당 순열이 소수인 경우 집합에 추가하는 메서드
private void permutation(String prefix, String str, Set<Integer> primeNumbers) {
int n = str.length();
// prefix가 비어있지 않으면, 정수로 변환하여 소수 판별
if (!prefix.isEmpty()) {
int num = Integer.parseInt(prefix);
if (isPrime(num)) {
primeNumbers.add(num);
}
}
// 순열을 구하기 위한 재귀 호출
for (int i = 0; i < n; i++) {
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n), primeNumbers);
}
}
// 주어진 정수가 소수인지 판별하는 메서드
private boolean isPrime(int num) {
if (num <= 1) return false;
if (num <= 3) return true;
// 2와 3으로 나누어 떨어지는 경우 소수가 아님
if (num % 2 == 0 || num % 3 == 0) return false;
// i의 제곱이 주어진 정수보다 작거나 같은 동안, 주어진 정수를 i로 나누어 떨어지는지 확인
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
// 위 조건을 모두 통과하면 소수로 판별
return true;
}
}
|
cs |
'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/자바] 달리기 경주 - Map (0) | 2023.05.27 |
---|---|
[프로그래머스/자바] 스킬트리 - Java (0) | 2023.04.30 |
[프로그래머스/자바] 피로도 - DFS (0) | 2023.04.30 |
[프로그래머스/자바] 여행경로 - DFS (0) | 2023.04.19 |
[백준/자바] 특정 거리의 도시 찾기 - Java 18352 (0) | 2023.03.09 |