이렇게 풀었습니다.
function listPrimes(num) {
let primeList = ''
for (let i = 2; i <= num; i++) {
let isPrime = true;
for (let n = 2; n < i; n++) {
if (i % n === 0) {
isPrime = false
}
}
if (isPrime) {
primeList = primeList + i + '-'
}
}
return primeList.slice(0,-1)
}
입력받은 범위 안의 소수들을 나열하라.
- 나의 응용력이 정말 바닥을 긴다는 사실을 절실히 알게 해준 문제.
- 문제를 이해하고, 코드를 쳐보고, 코드를 이해하는데 정말 오랜시간이 걸렸다.
시작부터 난관
- 문제를 보고 실소가 나왔다.
- 그리고 '모르겠다....' 라는 생각을 거의 30분은 하지 않았나.....
시행착오들
왜 인지 자꾸 false 가 반환되던 오류
return 을 잘 못 사용해서 생기는 현상이였다.
return 이 값을 반환하면 반복문이 종료된다는 사실을 다시 한 번 상기 시킬 수 있었다.
쌓여나가는 값을 얻고자 할 땐 return 보다는 변수에 값을 쌓아가는 것이 더 적합하다.
- 위와 비슷한 오류로 숫자가 단 하나만 쌓이는 오류가 있었다. 역시
return 의 사용으로 인해 반복문이 더 작동하지 않고, 하나의 값을 더하고, return 을 만나 종료되는 것이였다.
갑자기 순서대로 쌓이는 숫자들
- for 문의 위치가 문제였다.
isPrime 이 소수의 판단을 마치고 true 를 반환 할 때, 값을 출력하기 위한 for문이 소수임을 확인하고, true 일때만 출력해야 했다.
- 하지만 출력을 위한 for 문이
true 라는 값을 받은 후 계속 해당 for 문에서만 계속 반복되어 반복되는 횟수를 전부 출력하고 있었던 것이다.
- 위의 문제를 해결하기 위해 레퍼런스를 참고하여 출력 for 문의 위치를 바꿔주었다.
입력범위 내의 모든 홀수가 출력되는 오류
- 이 오류는 반복되는 숫자가 중복 출력되는 오류와 함께 일어났다.
- 연달아 출력되는 오류를 해결하기 위해
break 를 함께 사용했지만, 결과는 홀수가 출력되고 있었다.
- 원인은 if 의 위치였다.
- for 문의 위치를 변경하고
소수임을 판단하는 if 와 출력을 위한 if 로 나누어 사용하였다.
- 여기서 두 if 가 같은 for문 안에 위치하게 되면서, 모든 경우의 수를 판단한 후 소수의 여부를 판단하여 출력하는 것이 아니라,
나누었을 때 나머지가 0이 아닌 경우에도 isPrime 을 true로 판단하여 출력 한 것 이였다.
- 그러다 보니
나머지가 0이 아닌 모든 경우에 출력하게 되면서 중복 출력되는 오류가 함께 발생하게 되었다.
break 를 사용하여 반복은 멈췄지만, 남은 건 홀수 출력이였다.
출력을 위한 if 문의 위치를 for 문의 바깥에 작성해줌으로써 정상적으로 소수의 판단이 진행되고 반환되는 isPrime 값을 받아 정상적으로 출력되게 되었다.
이번 문제를 풀며 느낀 점
- 응용하는 능력이 많이 부족하다는 것을 이 문제에서 정말 크게 느꼈다.
- 레퍼런스를 참고하는 것과 검색을 하면 안되는 것으로 생각하지 말자.
- 괜한 마음에 참고하는 것을 굉장히 꺼려했는데, 오히려 참고하면서 다른 점과 틀린 점을 배우고, 문제를 해결 할 수 있는 인사이트를 얻는 것이 정말 중요하다는 것을 느꼈다.
- 개발자 도구의 디버깅을 잘 이용하는 게 정말 중요하다.
→ 내가 쓴 코드가 어떻게 작동하는지 확인하고, 수정해야 할 지점이 어디인지 아는 것은 문제를 해결하는 데 정말 큰 도움이 된다.
- 디버깅을 잘 사용하는게 큰 도움이 된다고 말씀해주신 동기님께 정말 감사하단 말을 전해드리고 싶다.