소수의 개수와 덧셈

이건선·2023년 2월 18일

문자열 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
}
profile
멋지게 기록하자

0개의 댓글