CS/알고리즘
[프로그래머스] 소수 찾기
infitry
2022. 6. 26. 22:36
반응형
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
"17" | 3 |
"011" | 2 |
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
문제 풀이
입력 된 숫자로 조합된 문자열로 모든 경우의 수를 찾아 소수가 되는지 판별 하는 문제이다.
모든 경우의 수를 찾으려면, DFS를 이용하면 된다.
17 의 경우
나올 수 있는 경우의 수는 1, 7, 17, 71 이다
-> 1이 소수인지 판별 소수이면 HashSet에 추가 방문표시
-> 17이 소수인지 판별 소수이면 HashSet에 추가 방문표시
-> 7의 방문해제
-> 1의 방문해제
-> 7이 소수인지 판별 소수이면 HashSet에 추가 방문표시
-> 71이 소수인지 판별 소수이면 HashSet에 추가 방문표시
이렇게 네 가지 경우의 수를 모두 탐색한다.
boolean[] visited;
Set<Integer> map;
public int solution(String numbers) {
visited = new boolean[numbers.length()];
map = new HashSet<>();
backTracking(0, numbers, "");
return map.size();
}
public void backTracking(int depth, String numbers, String current) {
if (depth == numbers.length()) {
return;
}
for (int i = 0; i < numbers.length(); i++) {
if (!visited[i]) {
visited[i] = true;
String number = current + numbers.charAt(i);
int intNumber = Integer.parseInt(number);
if (isPrime(intNumber)) {
map.add(intNumber);
}
backTracking(depth + 1, numbers, number);
visited[i] = false;
}
}
}
public boolean isPrime(int n) {
if (n < 2) {
return false;
}
for (int i = 2 ; i <= (int) Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
반응형