09009

[프로그래머스 lv2] k진수에서 소수 개수 구하기 본문

Algorithm
[프로그래머스 lv2] k진수에서 소수 개수 구하기
09009

문제 보기

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

 

프로그래머스

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

programmers.co.kr

 

 

 

문제 해결

처음에 Integer.parseInt로 해결하였을 때 테스트 케이스에 오류가 있었다. 이유를 알고보니 문제 예시에서 힌트를 찾을 수 있었다.

211020101011 -> 이 숫자는 int 범위를 넘어서 Long의 범위의 정수이다.

사실 위 정수는 문자열 "0"을 기준으로 split하면 [211, 2, 1, 1, 11] 이다. 이 때, 소수 여부를 확인할 때는 211, 2, 1 각각 확인하기 때문에 상관없으나 만약에 저 숫자에서 0이 없다고 가정해보자. 예를 들어 211121111111라고 하면 "0"을 기준으로 구분하여 소수 여부를 확인할 때 ([211121111111]) 이미 int 범위를 넘어선 Long의 범위의 정수가 되기 때문에 Long으로 꼭 변환을 해주어야 한다.

 

 

 

 

소스 코드

// https://school.programmers.co.kr/learn/courses/30/lessons/92335
import java.util.*;
class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        
        String number = convert(n, k);
        String[] arr = number.split("0");
       
        for (int i=0; i<arr.length; i++) {
            if (arr[i].length() > 0) {
                Long data = Long.parseLong(arr[i]);
                if (isPrimeNumber(data)) {
                    answer++;
                }
            }
        }        
        return answer;
    }
    
    // 소수 여부 확인 함수
    public boolean isPrimeNumber(Long num) {
        if (num <= 1) 
            return false;
        else {
            for (int i=2; i<(int)(Math.sqrt(num))+1; i++) {
                if (num % i == 0) 
                    return false;
            }
        }
        return true;
    }
    
    
    // 진법 변환 함수
    public String convert(int n, int k) {
        String str = "";
        while (n > 0) {
            str = String.valueOf(n % k) + str;
            n = n / k;
        }
        return str;
    }
    
}