프로그래머스_k진수에서 소수 개수 구하기

mingyu Lim·2023년 3월 1일

코딩테스트

목록 보기
6/32

문제 설명

양의 정수 n과 이 숫자를 k진수로 바꿨을 때, 0을 기준으로 나뉜 수들이 10진수의 기준으로 소수인지 판별하는 문제

  • 예시
    n = 437674 k = 3
    3진수 n = 211020101011 일 때, 0의 기준으로 나눈 수들은 211,2,1,1,11로 나눌 수 있다.
    이 때 나눈 수들이 소수인지 판별할 때의 수들은 211,2,11 이다. 이 때 주의 할 점은 나눈 수들이 10진수로 보았을 때에 소수인지 판별하는 것이다.

제한 사항

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

입출력

nkresult
43767433
110011102

코드 설명

// 소수 판별 함수
function isPrime(n){ 
    if(n === 1 || !n) return false
    
    let sqrt = Math.sqrt(n);
    for(let i = 2 ; i <= sqrt ; i++){
        if(n % i === 0)
            return false
    }
    return true
}


function solution(n, k) {
    var answer = 0;
    let change = n.toString(k)
    let stack = ''
    
    for(let i = 0 ; i < change.length ; i++){
        if(change[i] === '0' ) {
            if(isPrime(Number(stack))){
                answer += 1
            }
            stack = ''   
        }
      else stack = stack + change[i]
    }
    
    if(isPrime(Number(stack))) answer += 1
    return answer;   
}
    
  • isPrime: 소수 판별 함수이며, 제곱근(sqrt)메소드를 사용해서 시간을 줄여 소수인지 아닌지를 판별하였다. 만일 제곱근보다 작은 수들 중 하나의 수라도 나눠지면 소수가 아니기 때문에 false를 리턴하였고, 첫 조건문은 n이 1이거나, n이 빈 값일 수가 있기 때문에 미리 걸러낸다.
    약수들은 제곱근을 기준으로 한 쌍을 이루기 때문에 이 원리를 사용하였다.

  • n.Stirng(k): 양의 정수 n을 k진수로 바꾸어주어 문자열로 변환해주는 메서드이다.

  • 반복문

    • stack을 사용해서 '0'이기 전까지 숫자를 stack에 담아 만일 '0'일 경우 stack에 있는 수를 소수 판별 하고, 맞을 경우 answer의 값을 올려준다. 그리고 다음 숫자들을 담기위해 stack을 비워준다.
    • else : '0'이 아닐 경우 stack을 쌓아주고, else문에 넣지 않는다면, 스택을 비운 후 '0'이 stack에 쌓이기 때문에 따로 처리를 해주었다.

0개의 댓글