소수찾기
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers | return |
---|---|
17 | 3 |
011 | 2 |
입출력 예 설명
예제 #1 [1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2 [0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
풀이
개인적으로 쉬운 문제였습니다.
에라토스테네스의 체 + 순열알고리즘으로 쉽게 풀 수 있었습니다.
맨 처음 에라토스테네스의 채 알고리즘으로 소수들을 다 표시 한 다음
순열 알고리즘으로 뽑아낸 값이 소수인지 판별을 해주면 됩니다.
주의 해야 할 점은 순열 알고리즘으로 뽑아낸 값이 소수라서 정답을 1 증가시켰다면
해당 값은 값을 반대로 해주어 다시 카운팅 되지 않게 처리해주시면 됩니다.
전체코드
class Solution {
static boolean sosu[] = new boolean[10000000];
static boolean visited[] = new boolean[8];
static int ans[] = new int[8];
static int answer =0;
public static int solution(String numbers) {
isPossible();
for(int i=1; i<=numbers.length(); i++) {
dfs(0,i,numbers);
}
return answer;
}
public static void dfs(int level, int end, String numbers) {
if(level ==end) {
int num = 0;
for(int i=0; i<end; i++) {
num*=10;
num+=ans[i];
}
if(!sosu[num]) {
sosu[num] = true; // 중복방지
answer++;
}
return ;
}
for(int i=0; i<numbers.length(); i++) {
if(!visited[i]) {
visited[i] = true;
ans[level] = numbers.charAt(i)-'0';
dfs(level+1,end,numbers);
visited[i] = false;
}
}
}
public static void isPossible() {
sosu[0] = true;
sosu[1] = true;
for(int i=2; i<=(9999999/2); i++) {
for(int j=i+i; j<=9999999; j+=i) {
sosu[j] = true;
}
}
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 가장 큰 수 -JAVA (0) | 2020.09.09 |
---|---|
[프로그래머스] 문자열 압축 -JAVA (0) | 2020.09.09 |
[프로그래머스] 조이스틱 -JAVA (0) | 2020.09.06 |
[프로그래머스] 큰 수 만들기 -JAVA (0) | 2020.09.05 |
[프로그래머스] 더 맵게 - JAVA (0) | 2020.09.04 |