문제 설명 :
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 |