프로그래머스 - 완전탐색 - 소수 찾기
2021. 3. 11. 15:42ㆍAlgorithm
programmers.co.kr/learn/courses/30/lessons/42839
import java.util.HashSet;
import java.util.Set;
public class 소수_찾기 {
public static void main(String[] args) {
소수_찾기 o = new 소수_찾기();
System.out.println(o.solution("17"));
}
public int solution(String numbers) {
int answer = 0;
Set<Integer> resultNumSet = new HashSet<>();
for(int i=1; i<=numbers.length(); i++) {
printPermutation(i, "", numbers, new HashSet<Integer>(), resultNumSet);
}
return resultNumSet.size();
}
private void printPermutation(int depth, String result, String numbers, Set<Integer> isVisit, Set<Integer> resultNumSet) {
//종료
if(depth == 0) {
int resultNum = Integer.parseInt(result);
if(isPrimeNumber(resultNum)) {
resultNumSet.add(resultNum);
}
return;
}
//프로세스
for(int i=0; i<numbers.length(); i++) {
if(!isVisit.contains(i)) {
isVisit.add(i);
printPermutation(depth-1, result+numbers.charAt(i), numbers, isVisit, resultNumSet);
isVisit.remove(i);
}
}
}
private boolean isPrimeNumber(int number) {
if(number < 2) {
return false;
}
for(int i=2; i<number; i++) {
if(number%i == 0) {
return false;
}
}
return true;
}
}
알고리즘
- 백트래킹, 순열
- 순열을 만들어야하는데 주어진 문자열 중에서 1개를 뽑는 경우, 2개를 뽑는 경우,...... 문자열 전체를 뽑는 경우를 모두 탐색해야하기 때문에 뽑는 자릿수(재귀의 depth)를 1부터 문자열 길이까지 반복하여 확인해준다.
- 해당 위치를 방문했는지 확인하기 위해 HashSet을 이용하였다
- 결과의 중복을 막기 위해 HashSet을 이용하였다.
- 소수인지 판단하는 IsPrimeNumber는 간단하게 1보다 큰 수중에서(2부터) 자신의 전 숫자까지 무식하게 나눠봤을때 나머지가 0으로 나눠 떨어지는 경우가 없으면 소수라고 판단하였다.
'Algorithm' 카테고리의 다른 글
백준 - 1012 - 유기농 배추 (0) | 2021.03.15 |
---|---|
프로그래머스 - 완전탐색 - 카펫 (0) | 2021.03.12 |
백준 - 14888 - 연산자 끼워넣기 (0) | 2021.03.10 |
백준 - 15666 - N과 M(12) (0) | 2021.03.09 |
백준 - 15665 - N과 M(11) (0) | 2021.03.09 |