PROGRAMMERS/KAKAO

[프로그래머스] [JAVA] [Level 2] [2022 KAKAO BLIND RECRUITMENT] k진수에서 소수 개수 구하기

c0mmedes 2022. 10. 12. 00:29



1. 에라토스테네스 체 알고리즘

import java.util.*;

class Solution {
    // 에라토스 테네스 체 
    public static boolean Eratos(long n){
        int a = (int) n;
        boolean arr[] = new boolean[a+1];
        Arrays.fill(arr, true);
        arr[0] = arr[1] = false;
        
        for(int i=2; i<=Math.sqrt(n); i++){
            if(arr[i]) {
                int j=2;
                while(i*j<=n){
                    arr[i*j] = false;
                    j += 1;
                }
            }
        }
        
        if(arr[a]) return true;
        else return false;    	
    }
        
    public int solution(int n, int k) {
       
        int answer = 0;
        // 정수 n을 k진수로
        String jinsu = Integer.toString(n, k);
        
        // 0을 기준으로 잘라서 배열에 넣기
        String sarr[] = jinsu.split("0");
 
        for(int i=0; i<sarr.length; i++){
            if(!sarr[i].equals("")) {
                long num = Long.parseLong(sarr[i]); 
                if(Eratos(num)) answer++;
            }
            
        }                
        return answer;
    }
}
  • 1, 11번 런타임 에러
  • 1 ≤ n ≤ 1,000,000 
  • n을 k진수로 변환했을때 나오는 문자열의 길이가 지나치게 커짐
  • 지나치게 큰 수에 에라토스테네스의 체 알고리즘을 사용하면 효율성이 떨어지기 때문에 시간초과 발생

 

 

 

2. 소수판별 알고리즘

import java.util.*;

class Solution {
     
    // 소수 판별 
    public static boolean check(long x){
        // 1과 0은 소수x
        if (x<=1) return false;
        
        for(int i = 2; i <= Math.sqrt(x); i++){
            if(x % i == 0)
                return false;
        }
        return true;
    }
        
    public int solution(int n, int k) {
       
        int answer = 0;
        // 정수 n을 k진수로
        String jinsu = Integer.toString(n, k);
        
        // 0을 기준으로 잘라서 배열에 넣기
        String sarr[] = jinsu.split("0");
 
        for(int i=0; i<sarr.length; i++){
            if(!sarr[i].equals("")) {
                long num = Long.parseLong(sarr[i]); 
                if(check(num)) answer++;
            }
            
        }
                
        return answer;
    }
}
  • 통과

  • Integer.toString(n, k) // 정수 n을 k진수로
  • Integer.parseInt(i, N) // N진법 -> 10진법
  • Integer.toBinaryString(number) // 10진법 -> 2진법
  • Integer.toOctalString(number) // 10진법 -> 8진법
  • Integer.toHexString(number) // 10진법 ->16진법