JS 알고리즘 문제풀이/섹션 4. 완전탐색(블루투포스)

2.뒤집은 소수

crab. 2022. 1. 14. 11:51

📌강의 정리

toString을 해도 되지만 숫자자체를 몫과 나머지로 뒤집어보자.

n은 받지말고 arr만 받자.

앤서배열에 답만 푸쉬해서 리턴하자.

x of arr를 써보자 포문 안에 result의미에 res변수를 하나 선언한다.

while(x)를 하여 원본을 바꿔도 상관없다.

이제 이 안에 let t=x%10; res=res*10+t; x=parseInt(x/10); 을 하면

숫자만으로 자리가 서로 바뀐다.

그리고 isPrime()이라는 함수를 새로 만들어 소수를 구분하는 함수를 만들어야한다.

isPrime은 1에서 false를 반환하고 포문을 돌리되 받은수의 절반만큼만 돌리면 된다.

또한 소수를 구하는 포문을 돌릴때 제곱근까지만 돌려도 된다.

그 원리를 생각해 예로들면 16일 경우 4*4이므로 제곱근 4이후에는 반대로 돌아가게 되어

절반보다 훨씬 효율적으로 잡을 수 있다.

제곱근은 parseInt(Math.sqrt(num))을 하면된다.

이제 if문으로 나눠 0이 나오면 리턴폴스하고 무사히 다나오면 리턴트루하면 된다.

다른 방법으로 toString을 하면 split으로 나누고 reverse()로 바꾸고 다시 join('')으로 바꿔주면

다시 스트링이 된다. 이후 이 스트링을 parseInt 또는 Number로 숫자로 바꿔주면 된다.

📌느낀점

놀랍게도 전체적으로 푼방법이 같았다.

단지 하나 새롭게 배운것은 소수를 구할때 포문의 범위에서 제곱근을 사용하면 더욱 좋다는점과

함수를 사용하여 좀더 가독성 좋게 할 수 있다는 점

그리고 돌릴때는 문자방식과 숫자자체로 가는 방식 두개다 익숙해질 필요가 있다는 점이다.

//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){
                let answer = [];
                let tmp = 0;
                for(let i=0; i<arr.length; i++){
                    let flag = 0;
                    tmp = arr[i];
                    tmp = tmp.toString().split('').reverse().join('')
                    tmp = parseInt(tmp)
                    for(let j=2; j<=tmp/2; j++){
                        if(tmp%j === 0){
                            flag++;
                            break;
                        }
                    }
                    if(tmp === 1) break;
                    if(flag === 0) answer.push(tmp)
                }
                return answer;
            }
            let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
            console.log(solution(arr));
        </script>
    </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            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);
                    }
                    if(isPrime(res)) answer.push(res);
                }
                return answer;
            }
            
            let arr=[32, 55, 62, 20, 250, 370, 200, 30, 100];
            console.log(solution(arr));
        </script>
    </body>
</html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            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));
        </script>
    </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 4. 완전탐색(블루투포스)' 카테고리의 다른 글

5.K번째 큰 수  (0) 2022.01.14
4.졸업선물  (0) 2022.01.14
3.멘토링  (0) 2022.01.14
1.자리수의 합  (0) 2022.01.14