Problem Solving

[프로그래머스] k진수에서 소수 개수 구하기 (JAVA)

욕심만 많은 사람 2023. 6. 3. 16:18

class Solution {
    public int solution(int n, int k) {
        int answerCount = 0;
        String convertKnary = Integer.toString(n, k);
        
        for(int i = 0 ; i < convertKnary.length(); i++){
            char ch = convertKnary.charAt(i);
            if(ch == '0')
                continue;
            
            StringBuilder sb = new StringBuilder();
            for(; i < convertKnary.length(); i++){
                char thisCh = convertKnary.charAt(i); 
                if(thisCh == '0'){
                    break;
                }
                    
                sb.append(thisCh);
            }
            
            System.out.println("sb.length() :: " + sb.length());
            
            if(isPrimeNum(sb.toString())){
                answerCount++;
            }
        }
        
        return answerCount;
    }
    
    private boolean isPrimeNum(String knaryNum){
        long num = Long.parseLong(knaryNum);
        
        if(num <= 1)
            return false;
        
        for(int i = 2; i <= Math.sqrt(num); i++){
            if(num % i == 0)
                return false;
        }
        
        return true;
    }
}

key point

String convertKnary = Integer.toString(n, k);
long num = Long.parseLong(knaryNum);

진수 변환은 위와 같이 하면 매우 편함

retrospective

문제 파악에만 집중하고 제한사항, 주어진 값의 범위는 다소 소홀하게 봤음. [ 1 ≤ n ≤ 1,000,000, 3≤ k ≤ 10 ]

위의 제약사항으로 isPrimeNum()에서 String을 int로 바꿨을 때 범위에 벗어나는 경우가 존재해서 hidden test에 실패함. 따라서 int가 아닌 long으로 변수 선언하고 소수 판별하기!

long num = Long.parseLong(knaryNum);

정수 범위에 따른 타입 선정에 유념하기

⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

second-try

미쳤다.. 정규식 사용하면 쉽게 문자열 분리 가능.

String[] tokens = Long.toString(n, k).split("0+");

⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️