조건문 안에 처음 변수를 선언하면 scope때문에 나중에 그 변수를 사용할 수 없다. 코플릿 풀때는 변수선언은 전역에다가 하자.
function listPrimes(num) {
let result = '2'
//for문밖에 isPrime을 true라고 하면 for문안에서 false가 되고 다시 true가 될 수 없다
for(let i = 3 ; i <= num ; i = i+2){
let isPrime = true
for(let j = 2 ; j < i ; j++){
if(i % j === 0){
isPrime = false
break
}
}
if(isPrime){
result = result + '-' + i
}
}
return result
}
//num을 입력받으면 2부터 num까지 소수들을 리턴해야한다.
//i가 소수인지 아닌지 알아야해? i가 소수가 아니면 그냥 홀수인지 짝수인지 구하는 로직이된다.
//변수 result를 선언한다. '2'를 할당한다.
//for문을 만든다. i = 3 ; i <= num ; i++ (소수?)
//안쪽 for문을 만든다. j = 2 ; j < i ; j++ (j로 소수를 나누어 줄 것이다.)
//만약 i를 j로 나누었을 때 나머지가 0이 아니라면(소수이다)
//break로 j for문의 작동을 멈춘다.
//그렇지 않다면 (소수라면)
//result = result + i
//result를 리턴한다.
i가 소수여야하는지를 몰랐다.
i가 아무 수라면 이 로직은 짝수인지 홀수인지 구하는 로직이 된다. 그렇기 때문에 isPrime이라는 변수가 필요한 것이다.
j는 num보다 작은게아니라 i보다 작아야한다.
isPrime의 필요성
isPrime이라는 변수를 쓰지 않으면 소수를 구하는게 아니라 그냥 홀수를 찾는 로직이된다.
isPrime 선언의 위치
for문 밖에 선언과 할당을 하려고했었다.
for문 밖에서만 isPrime을 true라고 할당하면 for문안의 조건문 안에서 true인적이 없어서 값이 false로 바뀌면 i가 증가해서 true인 값이 되어야하는데도 다시 true로 변할 수 없다.
7/28
다시 풀어보았다
function listPrimes(num) {
let result = '2'
for(let i = 3; i <= num ; i = i+2){
let isPrime = true
for(let j = 2; j < num ; j++){
if(i%j === 0 && i !== j){
isPrime = false
break
}
}
if(isPrime === true){
result = result + '-' + i
}
}
return result
}