(SEB_FE) Section1 Unit5 반복문 연습 문제

PYM·2023년 2월 22일
0

(SEB_FE) SECTION1

목록 보기
23/38
post-thumbnail

⭐ Q. isPrime

문제
1 이상의 자연수를 입력받아 소수(prime number)인지 여부를 리턴해야 합니다.

💫내 코드

function isPrime(num) {
  // TODO: 여기에 코드를 작성합니다.
  // 의사코드 
  // num이 1이면, false 리턴하고 함수 종료. 
  // num이 1이 아니라면 for문에서 i로 2부터 num-1까지 돌면서 확인
  // 만약 num % i === 0 이면 변수를 false로 바꿔줌.

  let isPrimeNum = true;

  if(num === 1){
      return false;
  }

  for(let i=2; i<num; i++){
    if(num % i === 0){
      isPrimeNum = false;
    }
  }

  return isPrimeNum;

}

💫Reference

function isPrime(num) {
  let sqrt = parseInt(Math.sqrt(num));

  if (num === 1) {
    return false;
  }

  if (num === 2) {
    return true;
  }

  if (num % 2 === 0) {
    return false;
  }

  for (let i = 3; i <= sqrt; i += 2) {
    if (num % i === 0) {
      return false;
    }
  }

  return true;
}

💫초기식이 let i = 3 인 이유

  • 소수는 1과 2를 제외하기 때문에 반복문의 초기식을 3으로 해주자.

💫조건식이 i <= sqrt 인 이유

  • 특정 수의 약수 목록의 정중앙에는 그 수의 제곱근이 있다.
    ex.
    • 특정수: 12
    • 약수: 1-2-3-√12-4-6-12
  • 1*12-2*6-3*4-√12*√12-4*3-6*2-12*1
    즉, 정중앙 양쪽으로는 똑같은 식이기 때문에 제곱근까지만 확인해 보면 된다!

💫증감식이 i += 2 인 이유

  • 또한, 짝수의 경우 소수가 될 수 없기 때문에 반복문의 증감식을 2씩 증가시켜줘도 된다.

⭐ Q. listPrimes

문제

2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 합니다.

💫Reference

function listPrimes(num) {
  let result = '2';
  for (let candi = 3; candi <= num; candi += 2) {
    let isPrime = true;
    let sqrt = parseInt(Math.sqrt(candi));
    for (let divider = 3; divider <= sqrt; divider += 2) {
      if (candi % divider === 0) {
        isPrime = false;
        break;
      }
    }

    if (isPrime) {
      result = `${result}-${candi}`;
    }
  }

  return result;
}

  • 한 숫자에서 소수 판별 for문을 돌면서 소수가 아니라면, isPrime 변수를 false로 처리하고 break로 소수 판별 for문을 빠져나온다.
  • 바깥 for문에서 isPrime이 true라면 리턴할 문자열 변수 result에 그 숫자를 붙여준다.
profile
목표는 "함께 일하고 싶은, 함께 일해서 좋은" Front-end 개발자

0개의 댓글