본문 바로가기

코딩테스트

[자바스크립트] 뒤집은 소수 | 숫자 뒤집는 방법 | 소수 구하는 방법

문제 설명 : 

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

 

나의 문제 접근 : 

1) 각각의 수를 뒤집은 배열을 만든다.

2) 각각의 수가 소수인지 확인한 후 소수이면 출력한다. 

 

나의 코드 : 

function isPrime(num) {
    // 소수는 1과 자기 자신만으로만 나누어 떨어지는 수 임으로
    // num > i
    for(let i = 2; num > i; i++) {
    if(num % i === 0) { //이 부분에서 num이  다른 수로 나눠떨어진다면 소수가 아님
      return false;
     }
    }
   // 소수는 1보다 큰 정수임으로
   // 1보다 작으면 false를 리턴한다
   return num > 1;
}


function solution(num) {
    // 수를 뒤집는다. 
    const reversedNum = num.map(el => String(el)).map(el => Number(el.split('').reverse().join('')))

	//각각의 수가 소수인지 판단 후 출력.
    reversedNum.forEach(eachNum => {
        if(isPrime(eachNum)) console.log(eachNum)
    })
}

 

나는 이런식으로 문제를 풀었는데, 

아무리 생각해도 수를 뒤집는 부분의 코드가 비효율적이라는 생각이든다. 


숫자를 뒤집는 또 다른 방법 : 

스트링으로 변환하는 과정 없이 숫자의 계산만으로 수를 뒤집는 방법. 

function solution(arr){
    let answer=[];
    for(let x of arr){
        let res=0; // 결과 숫자를 담는다.
        while(x){ // x가 0이 되면 멈춘다.
            let t=x%10; //각 자리의 수
            res=res*10+t; // 수를 뒤집어 저장한다.
            x=parseInt(x/10); //10으로 나눈 수를 구한다. 앞자리수
        }
        if(isPrime(res)) answer.push(res);
    }
    return answer;
}

 

예시 숫자를 통해 자세히 알아보겠다.  

307이 있다. 

 

1)맨 처음 10으로 나눈 나머지를 구하면 ( let t = x %10 )

7이 나온다. 

 

2) 이 7이라는 수를 res에 담는다. 

현재 res는 0이므로, 

res=res*10+t; // 이 코드는

res = 0 * 10 + 7 // 이렇게 저장될 것이다. 

고로, res는 7

 

3)처음 들어왔던 x를 10으로 나누면, (x/10) 

30이라는 값이 나온다. 

이 값은 맨 뒷자리 수를 뺀 앞자리의 수이다. 

이 값을 가지고 다시 while문을 돌린다. 

 

4) 다음에 들어온 수는 30. 이 30을 10으로 나눈 나머지는 0이다. 

 

5) 이 0이라는 수를 res에 담는다. 

현재 res는 7이므로, 

res=res*10+t; // 이 코드는

res = 7 * 10 + 0 // 이렇게 저장될 것이다. 

고로, res는 70이 된다. 

 

6) 들어왔던 30를 10으로 나누면, (x/10) 

3이라는 값이 나온다. 

이 값을 가지고 다시 while문을 돌린다. 

 

...

 

9) 들어왔던 3을 10으로 나누면, (x/10)

0.3이라는 값이 나온다. 

지금까지 계속 적용해오던 parseInt를 통해 값을 0으로 바꾼다. 

0이 된 순간 while문은 멈춘다. 

 


소수 구하는 다른 방법 : 

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 isPrime(num){
    if(num===1) return false;

 

2부터 해서 약수가 발견되면 소수가 아니다.  제곱근 수 까지만 돌겠다는 것. 
    for(let i=2; i<=parseInt(Math.sqrt(num)); i++){
        if(num%i===0) return false; // 나누어지는 약수가 발견되면 소수가 아니다. 
    }
    return true;
}

 

예를 들어서,

16 은 1 x 16, 2 x 8,  4 x 4, 8 x 2 , 16 x 1 의 수로 이루어진다. 

생각해보면 중간이후로 회전된 내용이다. 

때문에 for문을 절반만 돌려도 된다. 이 안에서만 약수가 있는지 없는지를 확인하면 된다. 

 

 

'코딩테스트' 카테고리의 다른 글

[프로그래머스] 이상한 문자 만들기 - JS  (0) 2022.05.06
[LeetCode] Two Sum  (0) 2022.03.25
[백준] 세탁소 사장 동혁  (0) 2021.09.22
[백준] 전자레인지 - 파이썬  (0) 2021.09.22
[백준] 거스름돈 - 파이썬  (0) 2021.09.22