본문 바로가기
알고리즘/PROGRAMMERS

k진수에서 소수 개수 구하기(Lv.2)

by 현대타운301 2024. 3. 25.

 


 

문제 설명

 

 

 

입출력 예시

 

 

요약

k진수에서 조건에 맞는 소수 개수 구하기

 


 

풀이

 

접근 방식

1. 10진수 n을 k진수로 변환

  → 진수 변환 메소드 trans()를 만들어 변환

 

2. 조건에 맞는 소수 개수 구하기

  → P는 각 자릿수에 0을 포함하지 않기 때문에 0을 기준으로 split 후 소수 판별

  → isPrime() 메소드를 통해 판별

 


 

코드리뷰

 

import java.util.*;

class Solution {
    String str = "";
    // 진수변환 메소드
    public void trans(int n, int k) {
        boolean run = true;
        List<String> list = new ArrayList<>();
        while(run) {
            list.add(0, String.valueOf(n % k));	// 나눈 나머지를 list에 담는다.
            n /= k;	// 나눈 몫을 n에 담는다.
            if(n == 0) {
                list.add(0, String.valueOf(n % k));	// 몫이 0일 때까지 나머지를 list의 0번째 index에 담아준다.
                run = false;
            }
        }
        for(String s : list) {
            str += s;	// 순서대로 문자열에 합친다.
        }
    }
    // 소수 판별 메소드
    public boolean isPrime(long num) {	// k진수 숫자의 자릿수가 클 수 있기 때문에 Long type으로 선언
        boolean result = true;
        if(num == 0 || num == 1) {
            result = false;	// 0과 1은 소수에서 제외
        } else {
            int limit = (int)Math.sqrt(num);	// 에라토스테네스의 체를 사용해 제곱근까지만 나눗셈 실행
            for(int i = 2; i <= limit; i++) {
                if(num % i == 0) {
                    result = false;	// 나머지가 0인 경우가 생기면 소수에서 제외
                    break;
                }
            }
        }
        return result;
    }
    
    public int solution(int n, int k) {
        trans(n, k);
        String[] arr = str.split("0");	// 변환된 문자열 형태의 k진수를 0을 기준으로 split

        int answer = 0;
        for(String num : arr) {
            // 0이 연속해서 존재하는 경우 빈 문자열이 포함되기 때문에 !num.isBlank()조건 추가
            if(!num.isBlank() && isPrime(Long.parseLong(num))) {	// 진수변환을 하게 되면 자릿수가 커져 int 범위를 넘어가기 때문에 Long으로 parsing
                answer++;
            }
        }
        return answer;
    }
}

 

 

 

'알고리즘 > PROGRAMMERS' 카테고리의 다른 글

n진수 게임(Lv.2)  (1) 2024.03.28
게임 맵 최단거리(Lv.2)  (0) 2024.03.27
압축(Lv.2)  (0) 2024.03.25
모음사전(Lv.2)  (0) 2024.03.25
푸드 파이트 대회(Lv.1)  (0) 2024.03.24