1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import java.util.*;
class Solution {
static Set<Integer> set = new HashSet<Integer>();
public void DFS(ArrayList<String> list, ArrayList<String> res, int i, int n) {
// 마지막 배열을 입력했을 때
if (i == 0) {
return;
}
// 모든 경우의 수를 구하여 set에 저장
for (int j = 0; j < n; j++) {
res.add(list.remove(j));
String[] s = res.toArray(new String[res.size()]);
set.add(Integer.parseInt(String.join("", s)));
DFS(list, res, i - 1, n - 1);
list.add(j, res.remove(res.size() - 1));
}
}
public int solution(String numbers) {
int answer = 0;
String[] arr = numbers.split(""); // 숫자 분할
ArrayList<String> list = new ArrayList<String>(Arrays.asList(arr));
ArrayList<String> res = new ArrayList<String>();
DFS(list, res, list.size(), list.size());
// 소수 구하기
Iterator<Integer> iterSet = set.iterator();
while (iterSet.hasNext()) {
int i;
int n = iterSet.next();
int sqrt = (int) Math.sqrt(n);
if (n > 1) {
for (i = 2; i <= sqrt; i++) {
if (n % i == 0)
break;
}
if (i == sqrt + 1) {
answer++;
}
}
}
return answer;
}
}
|
cs |
주어진 수를 분할하여 나올 수 있는 모든 수를 구한 후 소수가 몇 개인지 판별하는 문제이다.
기존에 알게 된 ArrayList를 이용한 모든 경우의 수를 구하는 방법을 이용하였다.
새로운 방법으로 StringBuilder를 이용한 DFS를 이용하려 했지만 변수의 값이 임의로 변경되어 실패했다.
다른 사람의 풀이 중 훨씬 좋은 방법을 발견하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import java.util.HashSet;
class Solution {
public int solution(String numbers) {
HashSet<Integer> set = new HashSet<>();
permutation("", numbers, set);
int count = 0;
while (set.iterator().hasNext()) {
int a = set.iterator().next();
set.remove(a);
if (a == 2)
count++;
if (a % 2 != 0 && isPrime(a)) {
count++;
}
}
return count;
}
public boolean isPrime(int n) {
if (n == 0 || n == 1)
return false;
for (int i = 3; i <= (int) Math.sqrt(n); i += 2) {
if (n % i == 0)
return false;
}
return true;
}
public void permutation(String prefix, String str, HashSet<Integer> set) {
int n = str.length();
if (!prefix.equals(""))
set.add(Integer.valueOf(prefix));
for (int i = 0; i < n; i++)
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n), set);
}
}
|
cs |
permutation 함수를 보면 반복문을 통해 문자를 고르고, 고른 문자를 제거하는 방법으로 substring을 이용하였다.
또한 isPrime에 들어가기전 13번 라인의 a % 2를 통해 짝수를 배제함으로써 i = 3부터 i += 2로 빠르게 탐색이 가능하게 하였다.
단, 이 방법을 사용하기 위해서는 함수를 분리하여 반환 값을 통해 구분하거나, 특정 변수를 추가로 생성해야 한다.
'Programmers > Level2' 카테고리의 다른 글
큰 수 만들기 (0) | 2021.07.21 |
---|---|
짝지어 제거하기 (0) | 2021.07.20 |
단체사진 찍기 (0) | 2021.07.19 |
[카카오 인턴] 수식 최대화 (0) | 2021.07.19 |
124 나라의 숫자 (0) | 2021.07.18 |