자료구조/문제풀이

[프로그래머스 JAVA] Lv2. 소수찾기

휴먼코딩 2024. 8. 1. 20:52

Lv2. 소수찾기

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

문제설명

주어진 정수를 K진법으로 변환한 후변화된 문자열에서 각 0으로 구분된 숫자가 소수인지 아닌지 판단

접근방식

O(log(n) * sqrt(log(n))) 시간복잡도

 

  • Integer.toString(n, k) 메서드를 사용하여 n을 k진법으로 변환한다. O(log(n)) 시간이 소요된다.
  •  
  • isPrime 메서드는 문자열을 정수로 변환한 후, 소수 여부를 판별한다.
  • 숫자가 num일 때, 소수 판별에는 O(sqrt(num))의 시간이 소요된다.
  • 변환된 수는 log(n) 길이를 가지므로, 이 과정의 전체 시간 복잡도는 O(log(n) * sqrt(log(n)))이다.
  •  
  • 문자열을 0으로 분리하고 각 부분을 소수 판별한다.
  • 이 과정의 시간 복잡도는 문자열의 길이에 비례한다.
  • 문자열의 길이는 O(log(n))이므로 이 단계의 복잡도는 O(log(n) * sqrt(log(n)))다.

 


문제 조건 분석 과정

 

  • 정수를 k진법으로 변환하여 문자열로 바꾼다.
  • 변환된 문자열을 0을 기준으로 분리한다.
  • 각 부분 문자열이 소수인지 판별한다.
  • 소수인 경우에는 결과에 포함하지 않으며, 소수가 아닌 경우에는 결과를 증가시킨다.

 

전체코드

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) {
        int n = 437674; //변환할 수
        int k = 3; //변환할 진법 (3진법)

        //solution메서드 호출
        System.out.println(solution(n, k));
    }

    public static int solution(int n, int k) {

        int result = 0;
        //정수 n을 진법 k로 변환한 문자열
        String re = Integer.toString(n, k);

        //문자열을 0으로 구분하여 분리
        for(String rea : re.split("0")){
            //빈 문자열 무시
            if(rea.equals("")) continue;
            //문자열이 소수인지 확인
            if(isPrime(rea) == false){
                result++; //소수가 아닌 경우 result 증가
            }
        }

        return result;

    }

    public static boolean isPrime(String num){
        long n = Long.parseLong(num);

        //1은 소수가 아님
        if(n == 1){
            return true;
        }

        //2부터 n의 제곱근까지 나눠서 소수 여부 판별
        for(int i = 2; i <= Math.sqrt(n); i++){
            if(n % i == 0){
                return true; //나누어 떨어지면 소수가 아님
            }
        }

        return false;
    }
}