본문 바로가기

알고리즘

[PGS] 프로그래머스 - 소수찾기 (JAVA)

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.*;
import java.math.*;
class Solution {
    
    public static HashSet<Integer> numberArr;
    static boolean[] visited;
    static String tmp;
    
    public boolean isPrime(int x){
        if(x<2) return false;
		
		for(int i=2; i*i<=x; i++) {
			if(x % i == 0) return false;
		}
		
		return true;
    }
    
    public void makeNum(String numbers, int n, int d){
        //n : 뽑을 개수
        //d : 깊이
        if(d==n) {
            numberArr.add(Integer.parseInt(tmp));
            return;
        }
        else{
            for(int i=0;i<numbers.length();i++){
                if(!visited[i]){
                    visited[i] = true;
                    tmp += numbers.charAt(i);
                    makeNum(numbers, n, d+1);
                    visited[i] = false;
                    tmp = tmp.substring(0, tmp.length()-1);
                }
            }
        }
        
    }
    
    public int solution(String numbers) {
        visited = new boolean[numbers.length()];
        numberArr = new HashSet<>();
        tmp = "";
        int cnt = 0;
        
        for(int i=1;i<=numbers.length();i++){
            makeNum(numbers,i,0);
        }
        
        
        for(Integer s:numberArr){
            if(isPrime(s)){
                cnt++;
            }
        }
        
        return cnt;
           
    }
}

1. 카드로 만들 수 있는 숫자 hashSet에 넣기 (중복 제거)

2. 소수 판별해서 소수면 cnt++

 

소수 판별 함수는 그냥 외워버리자구 !

tmp = tmp.substring(0. tmp.length()-1); 부분을 그냥 아예 빈 문자열로 만들어버려서 틀렸었다. ㅜㅜ

그래도 예전에 못풀었던 문제를 풀어서 나름 뿌듯하다 :)