소요시간
25분 정도 걸렸다.
문제 난이도에 비해 꽤 많이 걸렸다고 생각한다.
사용한 자료구조 & 알고리즘
풀이과정
소스코드
import java.util.*;
class Solution {
static HashSet<Integer> set=new HashSet<>();
static boolean visited[];
static int count=0;
static HashSet<Integer> one=new HashSet<>();
public int solution(String numbers) {
boolean prime[]=new boolean[1000000];
prime[0]=true;
prime[1]=true;
for(int i=2;i*i<prime.length;i++){
if(prime[i]==false){
for(int j=i*i;j<prime.length;j+=i){
prime[j]=true;
}
}
}
for(int i=0;i<prime.length;i++){
if(!prime[i])
set.add(i);
}
visited=new boolean[numbers.length()];
dfs(0,0,numbers);
return count;
}
public static void dfs(int depth,int now,String num){
if(set.contains(now)&&one.contains(now)==false) {
one.add(now);
count++;
}
if(depth==visited.length)
return;
for(int i=0;i<visited.length;i++){
int next=num.charAt(i)-'0';
if(!visited[i]){
visited[i]=true;
dfs(depth+1,now*10+next,num);
visited[i]=false;
}
}
}
}
회고
dfs 에서 중복 소수를 탐색하지 않는 과정에서 해시셋 하나를 추가로 만든 후 확인하였는데 사실 밑의 for문에서부터 탐색하여 아예 다음 dfs 문을 탐색하지 않게 하는 방법도 있었을 것 같다. 사실 이 문제는 15분만에 풀었으나 이 방법을 찾다가 찾지 못해서 그냥 시간복잡도가 늘어나더라도 제출한 것이다. 어떻게 해야 for문에서 부터 거를 수 있었을까... 다른 사람의 포스팅을 참고해봐야겠다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212