[프로그래머스] 소수 찾기(JAVA)
업데이트:
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- “013”은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers | return |
---|---|
“17” | 3 |
“011” | 2 |
JAVA 풀이 과정
import java.util.*;
class Solution {
ArrayList<Integer> result;
boolean[] visited;
public int solution(String numbers) {
result = new ArrayList<Integer>();
visited = new boolean[numbers.length()];
int[] nums = new int[numbers.length()];
for(int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(numbers.charAt(i)+"");
}
//자리 수 마다 해당 배열을 perm 메서드에 보낸다.
for(int i = 1; i <= numbers.length(); i++) {
int[] resultArr = new int[i];
perm(nums, resultArr, nums.length, i, 0);
}
return result.size();
}
public boolean isPrime(int num) {
if(num <= 1) {
return false;
}
if(num == 2 || num == 3) {
return true;
}
int end = (int) Math.sqrt(num);
for(int i = 2; i <= end; i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
public void perm(int[] nums, int[] resultArr, int n, int r, int index) {
if(index == r) {
String realNum = "";
for(int i = 0; i < resultArr.length; i++) {
realNum += resultArr[i];
}
int num = Integer.parseInt(realNum);
if(isPrime(num)) {
if(!result.contains(num)) {
result.add(num);
}
}
return;
}
for(int i = 0; i < nums.length; i++) {
if(!visited[i]) {
visited[i] = true;
resultArr[index] = nums[i];
perm(nums, resultArr, n, r, index+1);
resultArr[index] = 0;
visited[i] = false;
}
}
}
}
결론을 먼저 말하자면 순열을 구하는 부분을 도저히 모르겠어서 답을 봤다.
일단 생각은 완벽했다.
- numbers로 만들 수 있는 가장 큰 수 구하기
- 에라토스테네스의 체로 가장 큰 수 까지의 소수를 모두 구하기
- numbers 순열을 구해서 소수 배열에 있는 수면 answer++하기
2번 까지는 무난하게 구현했으나 3번 순열이 문제였다. 순열을 한 번도 구해 본 적이 없어서 못해서 하루를,,, 씨름하다가 답을 보고 제출했다. 그리고 코드를 잘못 짠 걸수도 있으나,, 큰 수 까지의 소수를 모두 구하는 과정이 너무 오래 걸리는 건지 코드 실행이 되지 않았다 ㅎㅎ 그래서 그냥 어떤 수마다 소수인지 아닌지 판별하는 방식으로 변경했다.
다른 사람의 풀이
// 정인섭 , 테스트 , - , Tim J. Lee , 김여천 외 10 명
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 (n == 0) System.out.println(prefix);
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);
}
}
순열 부분이 좀 더 짧은 코드!
댓글남기기