문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.
function solution(s) {
let getArray = s.split(" ");
let createArray = new Map();
let changeArray = [];
let changeArray2 = [];
for (let i = 0; i < getArray.length; i++) {
for (let j = 2; j <= Number(getArray[i]); j++) {
if (getArray[i] % j == 0) {
createArray.set(getArray[i], (createArray.get(getArray[i]) || 0) + 1);
}
}
}
for (let [count, acc] of createArray) {
if (acc === 1) {
changeArray.push(count);
} else {
changeArray2.push(count);
}
}
return `${Math.min(...changeArray2)} ${Math.max(...changeArray)}`;
}
let s = "97 75 88 99 95 92 73";
console.log(solution(s));
소수는 1과 자신이 아니면 나뉘어 지지 않는 수이기 때문에 카운트가 1이 찍히는 경우가 가장 큰 소수이고 그 외의 경우에서 작은 수를 찾을 수 있다고 생각했다.
그래서 new Map()을 이용해서 객체를 만들고 value를 나뉘어지는 카운트 값으로 정의했다.
2번째 for문에서 만들어진 객체를 for (let [count, acc] of createArray)를 통해서 판별한다. count는 키 값이고 ,acc는 value값이다.
다른풀이
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(s){
let prime = []
let notPrime = []
let numArr = s.split(' ').map((elem)=>+elem)
for (i=0;i<numArr.length;i++){
isPrime(numArr[i])?prime.push(numArr[i]):notPrime.push(numArr[i])
}
let max = prime.sort((a,b)=>a-b).pop().toString()
let min = notPrime.sort((a,b)=>b-a).pop().toString()
return min+" "+max
}