문제 설명
해결과정
Solution.java
import java.util.*;
class Solution {
public int solution(String numbers) {
// 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하는 answer
int answer = 0;
// numbers의 각 자리의 문자들로 만들었는지 확인하는 boolean 배열 visited
boolean[] visited = new boolean[numbers.length()];
// numbers의 각 자리의 문자들로 만든 숫자를 집어넣을 HashSet
Set<Integer> set = new HashSet<>();
// 빈 문자열부터 재귀함수 실행
dfs(numbers, "", visited, set);
// System.out.println(set);
for(int i : set) {
// System.out.println(i + " " + sqrt(i));
switch (i) {
case 0 :
break;
case 1 :
break;
case 2 :
answer++;
break;
case 3 :
answer++;
break;
default :
if(!isPrime(i)) {
answer++;
}
break;
}
}
return answer;
}
// 매개변수 가 2부터 제곱근 까지 나누어 떨어지는지 확인
public boolean isPrime(int number) {
boolean check = false;
for(int i = 2; i < sqrt(number); i++) {
if(number % i == 0) {
check = true;
break;
}
}
return check;
}
// 제곱근에 반 올림 하는 함수
public int sqrt(int number) {
return ((int) Math.sqrt(number)) + 1;
}
// 정수인지 판단하는 함수
public boolean isNumeric(String number) {
try {
Integer.parseInt(number);
return true;
} catch(NumberFormatException e) {
return false;
}
}
public void dfs(String numbers, String number, boolean[] visited, Set<Integer> set) {
// 매개변수로 들어온 number가 정수로 변환될수 있는지 확인
if(isNumeric(number)) {
// 정수로 변환된 number 문자열을 HashSet에 집어넣는다.
set.add(Integer.parseInt(number));
}
// 다음 문자열을 찾기 위해 numbers 문자열을 탐색한다.
for (int i = 0; i < numbers.length(); i++) {
// 현재 탐색한 문자가 이전에 탐색한 문자가 아니라면
if (!visited[i]) {
// 현재 문자를 탐색했다고 visited에 표시
visited[i] = true;
// 현재 탐색한 문자를 기존 문자열에 추가한뒤 재귀함수 실행
dfs(numbers, number + numbers.charAt(i), visited, set);
// 기존에 탐색을 재 진행하기 위해 현재 방문은 다시 체크
visited[i] = false;
}
}
}
}
Java
복사