코딩테스트

[JS] k진수에서 소수 개수 구하기

미안하다 강림이 좀 늦었다 2023. 12. 24. 02:40

 

 

난이도: Lv. 2

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

알고리즘

1. n을 k진수로 변환한다.

2. 시작 인덱스를 0으로 초기화하고, 1.의 문자열을 순회하며 0을 만나면 시작 인덱스부터 0 전까지의 문자열을 복사해서 배열에 넣는다. 0을 만났을 때 다음 시작 인덱스는 0 다음 인덱스다. for문이 끝났을 때 시작 인덱스부터 마지막 문자까지의 문자열은 배열에 넣지 않은 상태이므로 배열에 넣어준다.

3. 배열의 각 원소에 대해 소수인지 확인한다.

 

 

코드

function isPrime(num) {
    if (num === '1' || num === '') { return false; }
    
    num = Number(num);
    const endLoop = Math.floor(Math.sqrt(num));

    for (let i = 2; i <= endLoop; i++) {
        if (num % i === 0) { return false; }
    }

    return true;
}

function solution(n, k) {
    var answer = 0;
    const kFormation = n.toString(k);
    const strArr = [];

    let startIdx = 0;
    for (let i = 0; i < kFormation.length; i++) {
        if (kFormation[i] === '0') { 
            strArr.push(kFormation.substring(startIdx, i)); 
            startIdx = i + 1;
        }
    }
    strArr.push(kFormation.substring(startIdx, kFormation.length));

    strArr.forEach((num) => { answer += isPrime(num) })

    return answer;
}

 

 

주저리

문자열 어떻게 잘라야할지 감이 안잡혀서 당황하다가 막상 코드 짜보니까 문자열 자르는 건 쉬웠다. 첫트에는 소수인지 구분하는 함수를 잘못썼다. 나머지 연산해야되는데 그냥 나누기를 하는 바보같은 짓을 했다. 근데 예시 테스트케이스는 다 통과했다는게 유머다. 아무튼 2트랑 3트에는 for문 끝나고 배열에 문자열 추가하는 부분에서 빈 문자열이나 '1'이 들어가는 경우에 대해 예외처리를 안해줘서 틀렸다. solution 함수에서 작성했더니 지저분해져서 isPrime 함수에 예외 처리해줬더니 코드도 조금은 깔끔해졌다.