알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 완전탐색 - 소수 찾기

HRuler 2020. 10. 20. 13:09

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/42839#qna

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 �

programmers.co.kr

2. 나의 풀이

import java.util.*;

class Solution {
    
    ArrayList <Integer> all_number = new ArrayList<>();
    String number = "";
    
    public int solution(String numbers) {
        int answer = 0;
        String [] numbers_split = numbers.split("");
        Arrays.sort(numbers_split);
        int len = numbers_split.length;
        boolean [] visited = new boolean[len];
        //System.out.println(Arrays.toString(visited));
        
        System.out.println(Arrays.toString(numbers_split));
        
        for(int i = 1; i <= len; i = i + 1) {
        	gyeongwoo(numbers_split, visited, len, i);
        }
        
        System.out.println(all_number);
        //System.out.println(Arrays.toString(visited));
        //System.out.println(Integer.parseInt("01"));
        for(int imsi : all_number) {
        	if(isPrime(imsi)) {
        		answer += 1;
        		System.out.println("imsi : " + imsi + ", answer : " + answer);
        	}
        }
        return answer;
    }
    
    //배열과 자릿 수가 매개변수로 주어질 때 해당 자릿 수로 나올 수 있는 모든 매개변수를 ArrayList에 
    //저장하는 메소드
    void gyeongwoo(String [] numbers_split, boolean [] visited, int len, int i){
    	if(i == 0) {
    		if(Integer.parseInt(number) == 0) {
    			
    		}else if(!all_number.contains(Integer.parseInt(number))) {
        		System.out.println(number);
        		all_number.add(Integer.parseInt(number));
    		}
    	}
    	
    	for(int j = 0; j < len; j = j + 1) {
    		if(visited[j] == true) {
    			continue;
    		}else if(visited[j] == false) {
    			visited[j] = true;
    			number += numbers_split[j];
    		}
    		gyeongwoo(numbers_split, visited, len, i - 1);
    		visited[j] = false;
    		number = number.substring(0, number.length()-1);
    	}
    }
    
    // 소수인지 확인하는 메소드
    boolean isPrime(int number) {
    	if(number == 1) {
			return false;
		}else if(number == 2) {
			return true;
		}
    	for(int i = 2; i <= Math.sqrt(number); i = i + 1) {
    		if(number % i == 0) {
    			return false;
    		}
    	}
    	return true;
    }
}

3. 다른 사람 풀이

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);

    }

}