알고리즘/프로그래머스

코딩테스트 고득점 kit / 완전탐색 / 소수 찾기

외계공룡 2020. 4. 10. 13:10

 

나의 풀이

import java.util.Set;
import java.util.HashSet;

class Solution {

    public void permutation(int[] arr, int start, int end, Set set){
       
        if(start == end){
   
            StringBuilder sb = new StringBuilder();
            for(int i=0; i<start; i++){
                sb.append(arr[i]);
            }
            
            int n = Integer.parseInt(String.valueOf(sb));
            boolean b = true;
            
            if(n < 2) return;
            for(int i=2; i*i<=n; i++){
                if(n % i == 0) {
                    b = false;
                    break;
                }
            }
            
            if(b) set.add(n);
            return;
        } 
        
        for(int i=start; i<arr.length; i++){
            swap(arr, start, i);
            permutation(arr, start + 1, end, set);
            swap(arr, start, i);
        }
        
    }
    
    public void swap(int[] arr, int i, int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    
    public int solution(String numbers) {
        int answer = 0;
        
        int[] arr = new int[numbers.length()];
        for(int i=0; i<numbers.length(); i++){
            arr[i] = Character.getNumericValue(numbers.charAt(i));
        }
        
        Set set = new HashSet();
        for(int i=1; i<=arr.length; i++){
            permutation(arr,0,i,set);
        }
        
        answer = set.size();
        return answer;
    }
}

이 문제는 순열을 활용하는 문제입니다.

처음에는 이 문제를 보고 다양한 풀이법을 생각하실 수 있습니다.

 

그러나 이중for문을 이용하여 substring을 이용해서 숫자들이 나올 수 있는 경우의 수를 구하려고 하면 "011" 로 "101"을 만들 수 없는 경우가 생깁니다.

 

그리고 Hash문제 풀때처럼 Map의 getOrDefault()메소드를 이용해서 숫자마다 개수를 Map에 저장하는 방법을 생각하면

그것을 이용해서 경우의 수 가짓수를 구하는 것 까지는 가능해도 가능한 문자열을 만드는 방법이 불가능해집니다.

 

따라서 순열을 이용해야 합니다.

즉, 모든 수를 나올 수 있는 경우의 수로 계산하려면 재귀함수를 이용한 순열을 사용하여야 합니다.

순열에 대한 풀이 방법은 아래링크의 개발자분 코드를 보고 참조하여 만들어봤습니다.

 

프로그래머스 알고리즘 : 소수 찾기 (java)

프로그래머스 알고리즘 (java) 소수 찾기 프로그래머스 (소수 찾기) 코드 리뷰 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하는 문제입..

jar100.tistory.com

다른 분들 풀이보니까 순열을 이용할때 swap 대신 substring을 사용하여 숫자를 교환하시는 분들도 있는데 나중에 한번 참고해서 공부해야겠습니다.

 

 

히스토리

 

chucoding/algorithm

알고리즘 문제풀이 사이트 도전~!! . Contribute to chucoding/algorithm development by creating an account on GitHub.

github.com