unsopower   1년 전

시간초과 문제도 아닌거같은데 어디가 틀린지 알 수 있을까요?ㅠㅠ

yhj1937   1년 전

제가 돌릴 땐 예제도 안 나오는데 코드를 다시 확인해보세요.

pielo   1년 전

int 배열 arr을 처음에 0이 아닌 수로 초기화 해주어야 합니다.

unsopower   1년 전

감사합니다!! 1로 바꾸니 되네요 근데 왜 0은 안되고 1은 정답인가요? 어떤 차이가 있는지 궁금한데 여쭤봐도 될까요?

pielo   1년 전

11번째 줄에서 22번째 줄까지 for 문 내부에서 z와 i의 값은 항상 2보다 크므로 z * i는 항상 합성수 입니다.

따라서 처음에 arr[] 배열을 0이 아닌 값으로 초기화 하고 해당 for 문을 지나면

20번째 줄에 의해서 모든 합성수 (k=z*i)의 배열 값은 0이 됩니다.

반면 소수는 z*i 꼴로 나타낼 수 없으므로 (0이 아닌) 초기값을 유지합니다.

결국 k가 소수이면 arr[k]는 0이 아닌값 (true)을 갖고, k가 합성수면 arr[k]는 0 (false) 값을 갖습니다.


만약 arr[] 배열을 0으로 초기화하면, arr[]의 모든 값은 그대로 0으로 유지되므로 해당 for문은 아무런 의미가 없어집니다.


다만, 해당 코드의 에라토스테네스 체 방법을 사용해서 소수 판별 배열을 구하는 방법은 그다지 효율적이지 않습니다. 이중 for문의 모든 인덱스 조합 (i, z)를 다 거치게 되기 때문입니다.


아래 코드는 에라토스테네스 체를 활용한 조금 더 효율적인 알고리즘 입니다. 아래 코드는 특정 i에 대해서만, 2번째 for문을 실행하므로 더 효율적입니다. 단, 질문자님의 코드와는 다르게 arr[]은 초기에 0으로 초기화 되어 있어야 하며, k가 소수인 경우 arr[k] == 0, k가 합성수 인 경우 arr[k] == 1이 됩니다.

unsopower   1년 전

정말 감사합니다!

댓글을 작성하려면 로그인해야 합니다.