알고리즘101 :: 프로그래머스 - 소수찾기
소수찾기는 크게 3가지 세션으로 나눠볼 수 있습니다.
1) 주어진 number를 문자로 쪼개기
2) 문자로 쪼갠것으로 모든 경우의 수를 만들기
3) 에라토스테네스체를 이용해 소수인지 검증하기
1의 경우에는
String str = "17" 인경우
String[] number = str.split("") 이용해서 1, 7로 쪼갤 수 있습니다.
2의 경우에는
string[] number, boolean[] picked, StringBuilder sb 를 활용합니다.
number는 1의 경우에서 구한것이므로 넘어가고
boolean[] picked = new boolean[number.length]; 로 선언
StringBuilder sb = new StringBuilder() 로 선언
HashSet<Integer> dff = new HashSet<>(); //중복되는 케이스를 방지. 만들 수 있는 경우를 모두 담을것임
make(number, picked, sb) 로 함수를 실행합니다.
int len = picked.length; //체크해야할 문자의 길이를 확인해보기 위함
int result = true; //picked에서 모두 true인지 false인지 확인하기 위함
for(boolean flag : picked){
if(!flag){ //아직 방문하지 않은 문자가 존재하는 경우이므로
result = false; //이후에 true 상태에서 return 하기 때문에 여기서는 false 로 대입
break;
}
}
if(result) return; //모두 방문하였으므로 확인하지 않아도 됌
for(int i=0; i<len; i++){ //길이 모두를 확인
if(!picked[i]){ //실행할때는 아직 방문하지 문자를 확인해야 합니다. 그래야 모든 경우를 만들 수 있습니다.
sb.append(number[i]); //number 의 i번째 위치를 가져오고
dff.add(Integer.parseInt(sb)); //정수형으로 선언해서 변환
picked[i] = true; //백트래킹, 방문했으므로 true
make(number, picked, sb); //재귀
picked[i] = false; //백트래킹, 방문해제 false
sb.deleteCharAt(sb.length()-1); //sb 마지막에 있는 엘리먼트 삭제
}
}
마지막에서는 에라토스테네스체로 소수를 검증합니다.
for(int i=2; i<=num/2; i++) //반만 확인해도 됩니다. 그 이후부터는 배수관계
for(int j=2; j*i<=num; j++)
NUMBER[i*j] = false; //자기자신 외에도 숫자가 존재하므로 소수가 아닙니다.
return NUMBER[num]; //num은 파라미터, 소수를 알아볼 숫자, num까지 확인하게 되면 현재 num값에서 false 인지 true인지 확인할 수 있습니다.
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
49
|
import java.util.*;
class Solution {
static HashSet<Integer> appendix = new HashSet<>();
public int solution(String numbers) {
int answer = 0;
String[] number = numbers.split("");
boolean[] picked = new boolean[number.length];
StringBuilder sb = new StringBuilder();
make(number, picked, sb);
boolean[] NUMBER = new boolean[10000000];
Arrays.fill(NUMBER, true);
NUMBER[0] = NUMBER[1] = false;
for(int s : appendix){
if(dd(s, NUMBER))
answer+=1;
}
return answer;
}
static boolean dd(int num, boolean[] NUMBER){
for(int i=2; i<=num/2; i++){
for(int j=2; j*i<=num; j++){
NUMBER[j*i] = false;
}
}
return NUMBER[num];
}
static void make(String[] number, boolean[] picked, StringBuilder sb){
int len = picked.length;
boolean result = true;
for(boolean flag : picked){
if(!flag){
result = false;
break;
}
}
if(result) return ;
for(int i=0; i<len; i++){
if(!picked[i]){
sb.append(number[i]);
appendix.add(Integer.parseInt(sb.toString()));
picked[i] = true;
make(number, picked, sb);
picked[i] = false;
sb.deleteCharAt(sb.length()-1);
}
}
}
}
|
cs |
'알고리즘' 카테고리의 다른 글
알고리즘104 :: 최소 스패닝 트리(MST) (0) | 2020.09.24 |
---|---|
알고리즘102 :: KAKAO_셔틀버스 (0) | 2020.09.22 |
알고리즘 100 :: 백준 순열과 조합(N과M 시리즈) (0) | 2020.09.21 |
알고리즘 99 :: 2019 카카오 블라인드 코딩테스트 - 후보키 (0) | 2020.09.07 |
알고리즘98 :: swea_3431_준환이의 운동관리 (0) | 2020.09.05 |
댓글
이 글 공유하기
다른 글
-
알고리즘104 :: 최소 스패닝 트리(MST)
알고리즘104 :: 최소 스패닝 트리(MST)
2020.09.24 -
알고리즘102 :: KAKAO_셔틀버스
알고리즘102 :: KAKAO_셔틀버스
2020.09.22 -
알고리즘 100 :: 백준 순열과 조합(N과M 시리즈)
알고리즘 100 :: 백준 순열과 조합(N과M 시리즈)
2020.09.21 -
알고리즘 99 :: 2019 카카오 블라인드 코딩테스트 - 후보키
알고리즘 99 :: 2019 카카오 블라인드 코딩테스트 - 후보키
2020.09.07