문제설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
해결 방법
DFS(깊이우선탐색)을 사용했다.
1) DFS로 입력된 정수 배열로 만들 수 있는 숫자를 모두 찾는다.
2) 숫자가 소수인지 판별한다.
3) 소수이면 set에 저장해 중복되는 값을 제거한다.
JAVA
package programmers;
import java.util.*;
public class p_42839 {
static HashSet <Integer> map = new HashSet<>();
static int[] visit;
public static boolean check(int num) {
if(num == 1 || num == 0) return false;
for(int i = 2; i <= Math.sqrt(num); i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
public static void dfs(int x, String s, String num) {
visit[x] = 1;
num += String.valueOf(s.charAt(x));
int tmp = Integer.parseInt(num);
if(!map.contains(tmp) && check(tmp)) {
map.add(tmp);
}
for(int i = 0; i < s.length(); i++) {
if(visit[i] == 0) dfs(i, s, num);
}
visit[x] = 0;
}
public static int solution(String s) {
visit = new int[s.length()];
for(int i = 0; i < s.length(); i++) {
dfs(i, s, "");
}
return map.size();
}
public static void main(String[] args) {
String s = "17";
String s2 = "011";
System.out.println(solution(s));
}
}
'Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 더 맵게 (0) | 2020.04.02 |
---|---|
[프로그래머스] 전화번호 목록 (0) | 2020.04.01 |
[프로그래머스] 가장 큰 수 (0) | 2020.04.01 |
[프로그래머스] 쇠막대기 (0) | 2020.04.01 |
[프로그래머스] 주식가격 (0) | 2020.04.01 |
댓글