JS.연습문제 (소수 구하기)

Vorhandenheit ·2021년 6월 14일
0

JS.연습문제

목록 보기
2/12
post-thumbnail

장장 몇시간을 붙잡고 있었던 문제, 생각해보면 별거 없는 문제 였는데 이것 저것 시도하고 지엽적으로 보다 보니 오래걸렸다.
소수를 구하는 방법은 4가지 정도가 있다.
이중 for 에서

1.break 없이
2.label을 사용하는 방법
3.에라토스테네스 체 이용하기
4.break 사용

<문제>

소수를 구하라

function solution(num) {
  let count = 0
  let answer = 0
	for (let i = 2 ; i < str.length; i++) {
    	for(let j =2 ; j <= i; j++) {
        	if (i % j !== 0) {
              count += 1
            }
        }
     if (count === 1) {
     	answer += i
       	count = 0
     }
      else
      count = 0
    }
  return answer
}

소수가 1을 제외하고는 1개의 값만을 가진다는 것을 이용한 방식

<2번 풀이>

function solution(num) {
	let answer = '2'
  label:
	for (let i = 3; i <= num; i++) {
    	for (let j = 2; j <= i; j++) {
          if (i % j === 0) {
            prime = false
        	continue label
          }
        }
      	if (prime) {
        	answer += i
        }
    }
}
  • label : 특정 영역을 식별할 수 있도록 해주는 식별자
    -break와 continue 동작을 특정영역으로 이동시킬 수 있음

<에라토스테네스 체>

function solution(num) {
	let sqrt = parseInt(Math.sqrt(num))
    if (num === 1) return false
  	else if 
	for (let i = 2; i <= sqrt; i ++) {
  		if (num % i === 0) {
    		return false
  		}
	  }
    }
 return true
}

대중적이고 시간 복잡도도 짧은 방식!

<break 사용>

function solution(num) {
  	let answer = '2'
	for (let i = 3; i <=num; i++) {
      let prime = true
    	for (let j = 2; j < i; j++) {
        	if(i % j === 0) { // i 가 한 번이라도 j값을 통해 나누어 떨어지면, 소수가 되지않음
              prime = false
            	break
            }
        }
      	if (prime) { 
        	answer += i
        }
    }
 return answer
}

-break가 왜 저 위치에 있는지, 뭘 그만두고 새로운 연산에 들어가는지 보고
-i === j 는 왜 다른 바디에 있는지 확인!

profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글