Algorithm/프로그래머스

[고득점kit/완전탐색] 소수찾기

녱녱 2023. 6. 21. 10:44

사실 처음엔 n 자리에 올 수 있는 수 / 올 수 없는 수 이렇게 나눠서 풀려다가 이게 효율이 더 떨어질 것 같다는 생각이 팍!들어서 그냥 구할 수 있는 모든 숫자의 조합을 구하고 소수 판별을 하기로 결정했다!


import java.util.*;
class Solution {
    HashSet<Integer> numberSet = new HashSet<>();
    public void recursive(String comb, String others){
        //comb: 여태까지 조합된 숫자
        //others: 사용하지 않은 숫자
        //1. 현재 조합된 숫자를 set에 추가해줌
        if(!comb.equals(""))    //comb가 빈스트링이 아닐때
            numberSet.add(Integer.valueOf(comb)); 
        //2. 남은 숫자 중 한 개를 더해 새로운 조합을 만듦 
        for(int i = 0; i < others.length(); i++){
            recursive(comb + others.charAt(i), others.substring(0, i) + others.substring(i+1)); //(others에서 아직 쓰지 않은 숫자 중 하나만 쓰길 원함, 사용한 i는 빼기 위해 0~i-1까지, i+1~끝까지만 남김)
        }
         
    }
    public boolean isPrime(int num){
        if(num == 0 || num ==1) return false;
        
        int lim = (int)Math.sqrt(num);
        
        for(int i = 2; i <= lim; i++){
            if(num % i == 0) return false;
        }
        return true;
    }
    public int solution(String numbers) {
        int count = 0;
        //모든 조합의 숫자를 만듦
        recursive("", numbers); //(아직 조합된 숫자가 없음, 처음 주어진 숫자)
        //소수의 개수만 세기
        Iterator<Integer> it = numberSet.iterator();    //numberSet이 실체. numberSet안에 요소를 다 사용할 때
        while(it.hasNext()){
            int number = it.next();
            if(isPrime(number)) count++;
        }
        //센 소수의 개수 반환
        return count;
    }

}

https://coding-grandpa.tistory.com/81

이 분 내용으로 풀었다,, 사실 부끄럽지만 전 아직도 재귀가...넘넘 어려워용... 유튜브 댓글에 재귀 동작과정 올려두셨던데 이해 안되면 참고~.~

1 > 17은 이해했는데 7을 어떻게 고르지...?라고 고민하고 있었는데 이게 재귀라는 사실을 내가 잊고있었던 것 정신차려!!!!!!!!!!!