far

[JS 알고리즘] 뒤집은 소수 본문

알고리즘/알고리즘 베이스

[JS 알고리즘] 뒤집은 소수

Eater 2023. 3. 26. 04:03

뒤집은 소수

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하는 프로그램을 작성하세요. 예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력한다. 단 910를 뒤집으면 19로 숫자화 해야 한다. 첫 자리부터의 연속된 0은 무시한다.

 

입력설명
첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다.
각 자연수의 크기는 100,000를 넘지 않는다.

 

출력설명
첫 줄에 뒤집은 소수를 출력합니다. 출력순서는 입력된 순서대로 출력합니다.

 

입력예제
32 55 62 20 250 370 200 30 100

 

출력예제
23 2 73 2 3

 

// 나의 풀이

function isPrime(num){
    if (num === 1) return false

    for(let i = 2; i <= Math.sqrt(num); i++) {
        if (num % i === 0) {
            return false
        }
    }
    return true
}

function solution(arr){
    let answer = [];
    for (let i = 0; arr.length > i; i++) {
        const arrtmp = arr[i].toString();
        // const arrtmp = arr[i].toString().split('').reverse().join(''); << 가능
        let reverseNum = "";
        for (let j = arrtmp.length - 1; j >= 0; j--) {
            reverseNum += arrtmp[j]
        }
        if (isPrime(parseInt(reverseNum))) answer.push(parseInt(reverseNum))
    }
    return answer;
}

let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
console.log(solution(arr));

나같은 경우 문자열로 만들어 for문으로 하나씩 뒤집었는데, 다 풀고나서 reverse가 생각이 났다. 또, 뒤집었을 때 맨 앞자리가 0일경우를 대비해 parseInt를 사용했다.

isPrime부분은 원래 Math.sqrt를 안쓰고 다른걸 써서 풀었었는데 정답을 보고 바꿔놨다가 까먹었는지 이 식으로 저장이 되어있었다..

// 강의의 풀이 1

function isPrime(num){
    if(num===1) return false;
    for(let i=2; i<=parseInt(Math.sqrt(num)); i++){
        if(num%i===0) return false;
    }
    return true;
}
function solution(arr){
    let answer=[];
    for(let x of arr){
        let res=0;
        while(x){
            let t=x%10;
            res=res*10+t; // <===  숫자 뒤집어짐
            x=parseInt(x/10); // <=== break걸도록 식 사용
        }
        if(isPrime(res)) answer.push(res);
    }
    return answer;
}

let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
console.log(solution(arr));

제곱근을 판별해주는 함수 Math.sqrt를 사용해 isPrime의 반복 횟수를 줄인 식이다. Math.sqrt에서 정수가 나온다면 이미 소수가 아니기 때문에 여기까지만 반복문을 돌려주는 것이다. 또, while문 내부의 식을 사용하면 JS 내장함수를 사용하지 않고도 숫자를 뒤집을 수 있다.

// 강의의 풀이 2

function isPrime(num){
    if(num===1) return false;
    for(let i=2; i<=parseInt(Math.sqrt(num)); i++){
        if(num%i===0) return false;
    }
    return true;
}
function solution(arr){
    let answer=[];
    for(let x of arr){
        let res=Number(x.toString().split('').reverse().join(''));
        if(isPrime(res)) answer.push(res);
    }
    return answer;
}

let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
console.log(solution(arr));

JS내장함수를 써서 뒤집은 식

Comments