본문 바로가기
코딩테스트

[프로그래머스] Lv2. k진수에서 소수 개수 구하기 - Java

by CuckooBird 2024. 9. 13.

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

 

프로그래머스

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

programmers.co.kr


풀이

kForm에 k진법으로 변환된 결과를 뒤집힌 상태로 받습니다.

 

StringTokenizer로 0을 기준으로 문자열을 분리하고, 문자열을 하나씩 검사하면서 StringBuffer로 뒤집어주어 소수를 판정합니다. 값이 크게 나올 경우 런타임에러(1번과 11번의 경우)가 날 수 있으므로 double 형태로 소수를 판정합니다. 

import java.util.*;
class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        
        String kForm = "";
        
        while(n >= k) {
            kForm += String.valueOf(n%k);
            n /= k;
            if(n < k) kForm += String.valueOf(n);
        }
        
        StringTokenizer st = new StringTokenizer(kForm, "0");
        StringBuffer sb = new StringBuffer();
        for(int i=0; st.countTokens() > 0; i++) {
            sb = new StringBuffer(st.nextToken());
            String str = sb.reverse().toString();
            double curr = Double.valueOf(str);
            if(isPrime(curr)) answer++;
        }
        
        return answer;
    }
    
    public static boolean isPrime(double num) {
        if(num <= 1) return false;
        
        for(int i=2; i<=Math.sqrt(num); i++) {
            if(num % i == 0) return false;
        }
        
        return true;
    }
}

 

k진법으로 변환하는 것은 Integer.toString(n, k)으로도 가능하다고 하니 참고하시면 좋을 것 같습니다. 저는 다른 분들의 풀이를 보면서 깨닫게 되었습니다.

 

문자열을 뒤집는 것은 StringBuffer로 가능합니다.  sb.reverse().toString() 을 통해서 얻을 수 있습니다. 그 전에 String값을 StringBuffer로 변환하는 과정이 필요하므로 sb를 계속해서 초기화시켜주기로 합니다. 물론 위에 Integer.toString()을 사용했다면 필요없는 작업입니다.