소수 구하기
알고리즘 공부 간 기록이 필요한 문제들에 대한 정리를 기록하는 포스트 입니다.
1. 문제 요건
주어진 숫자들의 역수를 검사하여 소수임을 확인하라.
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 = 0;
// 숫자 역순으로 바꾸는 법
while (x) {
let t = x % 10;
res = res * 10 + t;
x = parseInt(x / 10);
}
if (isPrime(res)) answer.push(res);
}
return answer;
}
function solution2(arr) {
let answer =[]
for(x of arr) {
let reverseNum = ""
let tmp = x;
reverseNum = parseInt(x.toString().split('').reverse().join(''))
if(isPrime(reverseNum)) {
answer.push(parseInt(reverseNum))
}
}
return answer
}
let arr = [32,55,62,20,250,370,200,30,100]
3. 결과정리
이 문제는 난이도가 높다기 보다는 시간복잡도 측면에서 소수를 판별하는데 sqrt 를 통해 전체다 검사하는것이 아니라 제곱근 만큼만 검사를 한다. 약수의 경우 항상 큰수와 작은수가 있기 때문에 작은수를 검사하게 되면 큰수는 당연히 검사가 되는 개념으로 이해하면 될 것 같다. 그런 이유로 sqrt 가 아닌 단순 2로 나누어 검사해도 무방하다.
그리고 주어진 숫자를 역순으로 바꾸는 방법을 2가지 방법으로 풀어보았다. solution2 의 경우처럼 내장함수를 사용하면 손쉽게 변경할 수 있다.
reverseNum = parseInt(x.toString().split('').reverse().join(''))
하지만 내장함수 없이도 풀 수 있도록 하기 위해 다양한 방법으로 연습해야 하기 때문에 solution 에서 사용하여 풀어보았다.
while (x) {
let t = x % 10;
res = res * 10 + t;
x = parseInt(x / 10);
}
res * 10 + t 알고리즘을 통해서 역순으로 뒤집는 방법인데 이부분을 오늘 처음 알게 되었다. 이부분은 한번씩 그려가며 학습해보는것이 좋을 것 같다.
4. Key Point
- 소수 구하기 위한 방법(고난도 알고리즘의 경우 추후 진행)
- 내장함수 및 기본 알고리즘 활용