문제는 다음과 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/42839
풀이는 다음과 같다.
import java.util.*;
class Solution {
static HashSet<Integer> set = new HashSet<>();
static boolean[] visited;
public int solution(String numbers) {
char[] nums = numbers.toCharArray();
visited = new boolean[nums.length];
backTracking(0, nums, 0);
int answer = 0;
for(int s : set) {
if(isPrime(s)) answer++;
}
return answer;
}
static void backTracking(int depth, char[] nums, int now) {
if(depth == nums.length) {
set.add(now);
return;
}
if(now > 1) {
set.add(now);
}
for(int i = 0 ; i < nums.length ; i++) {
if(visited[i]) continue;
visited[i] = true;
int next = (now * 10) + (nums[i] - '0');
backTracking(depth+1, nums, next);
visited[i] = false;
}
}
static boolean isPrime(int a) {
if(a == 0 || a == 1) return false;
for(int i = 2 ; i <= (int) Math.sqrt(a) ; i++) {
if(a % i == 0) return false;
}
return true;
}
}
풀이는 다음과 같이 했다.
backTracking
함수를 통해 주어진 숫자들을 방문하며 모든 경우의 수를 HashSet<Integer> set
에 넣어주었다.
해당 set
를 순회하며 나오는 해당 숫자를 isPrime
함수를 통해
소수 여부를 판별 후 answer
숫자값을 늘려준다.
유의해야 할 점
now * 10 + (nums[i] - '0')
을 통해 다음 숫자로 넘어가는 부분이 중요하다.
예를 들어 String 형태이면, substring, +=
를 사용해서
새로운 String을 만들고 원상복구해야하지만,
위와 같이 int형으로
now * 10 + (nums[i] - '0')
를 사용하면 이전 단계로 돌아갈 때
곧바로 이전 값을 얻어낼 수 있고 원상복구 할 필요 없다.