내가 푼 코드(문제 발생 코드)

로직 설명
1. 1000까지의 솟수를 찾아 내고자한다.
2. 솟수를 찾아 담아낼 배열을 만든다(절반크기정도면 차고 남음)
3. 솟수는 자기 자신과 1로만 나누어 질 수 있는 값을 으미한다.
4. 첫 for문을 보면 n의 크기가 2씩 증가 이것은 짝수는 체크 하지 않겠다는 것을 의미 (어차피 2로 나누어짐)
5. 처음에 배열에 2~3 넣은 이유 ! 우리는 이것을 활용해서 솟수인지 나누어 보려고하기 떄문에
6. flag를 준 이유! 값이 솟수인지 확인해서 솟수일 경우 값을 넣어주기 위해서
7. 두 번째 for문에서 prime[i]*prime[i] 인 이유는
약수는 쌍을 가지게 되는데 어차피 4로 안 나누어 떨어지면 25로도 안나누어떠러진다(100기준) 그렇기에 연산 줄일 수 있음
문제 발생 원인
마지막에 값을 넣는 if절의 위치를 확인해보아라
간단하게 눈에 보일 것이다. 두번째 for문안에 있다.
그렇다면 저것은 2로 나누어떨어지나요? 아니네요 2 저장 3으로 나누어떨어지나요 ? 아니네요 3저장 이런 식으로 모든 숫자의 약수가 아닌 값들을 모두 저장하게 될 것이다.
해결 방법
첫번째 for문으로 빼준다.
회고
생각보다 단순한 부분에서 틀렸다.
기존에 솟수를 구하는 것은 저것보다 복잡하게 sqrt를 이용해서 루트 값을 구하고 거기까지의 값을 반복 맥스로 정해서 연산하고 반대쪽에 위치하는 값들은 하나하나 다시 확인하는 일련의 로직을 수행했었다.
위의 코드를 보니 기존의 방식보다 더 효율적인 것 같다.
코드를 짜면서 효율적인 방식이 있는지 여러번 확인하며 짜는 습관을 들여야겠다.
문제의 발생원인을 분석했을 때
수도코드를 정말 대충 적었기 때문이라는 생각이 든다.
이를 해결하기 위해 수도코드를 작성할 때 적어도 반복문과 조건문내부에 들어갈 것들은 다시 한번 확인하는 습관을 가져야겠다.
'이전 학습 내용' 카테고리의 다른 글
| 재귀 알고리즘의 분석 (0) | 2022.12.23 |
|---|---|
| java 이진 검색 알고리즘 (0) | 2022.12.13 |
| Why Use Spring? (0) | 2022.12.06 |
| Framework (0) | 2022.12.06 |
| 띠용~~ 인터페이스와 오버로딩 (0) | 2022.12.04 |