양의 정수 n과 이 숫자를 k진수로 바꿨을 때, 0을 기준으로 나뉜 수들이 10진수의 기준으로 소수인지 판별하는 문제
211,2,1,1,11로 나눌 수 있다.211,2,11 이다. 이 때 주의 할 점은 나눈 수들이 10진수로 보았을 때에 소수인지 판별하는 것이다.| n | k | result |
|---|---|---|
| 437674 | 3 | 3 |
| 110011 | 10 | 2 |
// 소수 판별 함수
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진수로 바꾸어주어 문자열로 변환해주는 메서드이다.
반복문
answer의 값을 올려준다. 그리고 다음 숫자들을 담기위해 stack을 비워준다.else : '0'이 아닐 경우 stack을 쌓아주고, else문에 넣지 않는다면, 스택을 비운 후 '0'이 stack에 쌓이기 때문에 따로 처리를 해주었다.