문제

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

걸린 시간

-

풀이

JavaScript

function solution(n, k) {
    // 소수 판별
    const isPrime = (num) => {
        if(num === 1) return false;
        for(let i = 2; i*i <= num; i++){
            if(Math.floor(num%i) === 0) return false;
        }
        return true;
    }
    // k진수 변환
    let s = '';
    while(n !== 0){
        s = Math.floor(n%k) + s;
        n = Math.floor(n/k);
    }
    // 개수 세기
    let ans = 0;
    for(let d of s.split('0')){
        if(d === '') continue;
        if(isPrime(parseInt(d))) ans++;
    }
    return ans;
}

소수를 보고 반사적으로 에라토스테네스의 체를 이용하여 소수를 판별하려고 했는데 틀린 테케가 있어 잘 생각해보니, n 보다 큰 수를 판별해야 하는 경우도 있었다. (예를 들어 3진수로 1111111 인 수는 고작 1093)

놓친 부분

  • 소수 판별 시 1의 처리
  • 공백 요소의 예외 처리

항상 까먹는 것들

  • 소수 판별 알고리즘
  • 진수 변환 방법
  • javascript 의 number 자료형은 정수 계산을 위해선 Math.floor 로 내림을 해 주어야 한다.
  • string to number 은 parseInt 이다.

진수 변환

    let s = '';
    while(n !== 0){
        s = Math.floor(n%k) + s;
        n = Math.floor(n/k);
    }

위 알고리즘을

    let s = n.toString(k);

number 자료형 내장 함수인 toString() 를 이용하여 한번에 구할수도 있다.

    console.log(parseInt(s, k)); // k진수 -> 10진수

반대로 parseInt 함수를 이용하면 k진수에서 10진수 변환도 쉽게할 수 있다. (10진수 문자열만 number 자료형으로 변환할 수 있는게 아녔다.)

댓글