https://school.programmers.co.kr/learn/courses/30/lessons/42839
설명
왜... 나는 완전탐색이 아직 서툰 것인가...
코딩테스트 보기전에 다시 한번 정리하고 간다.
코드
import java.util.*;
class Solution {
static Set<Integer> numSet;
static boolean[] visited;
public int solution(String numbers) {
int answer = 0;
visited = new boolean[numbers.length()];
numSet = new HashSet<>();
// 만들 수 있는 문자열의 길이에 따라 탐색한다.
for(int l = 1; l <= numbers.length(); l++) {
dfs(l, "", 0, numbers);
}
for(int n : numSet) {
boolean isSosoo = true;
if(n == 2) answer++;
else if(n ==0 || n == 1) continue;
else {
// 소수 판별은 2부터 제곱근까지만 하면 된다.
for(int i = 2; i <= Math.sqrt(n); i++) {
if(n % i == 0) {
isSosoo = false;
break;
}
}
if(isSosoo) {
answer++;
}
}
}
return answer;
}
static void dfs(int length, String n, int depth, String numbers) {
// 만약 depth가 내가 만드려고 하는 문자열의 길이와 같다면 -> 탐색 종료
if(depth == length) {
numSet.add(Integer.parseInt(n));
return;
}
// Permutation을 구하는 문제이므로 방문 여부만 확인하고, 맨 처음부터 탐색한다.
for(int i = 0; i < numbers.length(); i++) {
if(!visited[i]) {
visited[i] = true;
dfs(length, n + String.valueOf(numbers.charAt(i)), depth + 1, numbers);
visited[i] = false;
}
}
}
}
반응형