1-11 소수 나열하기 (에라토스테네스의 체)
1. 현재 학습 진도
몇 챕터/몇 강을 수강 중이신가요?
1-11
2. 시도해보신 내용
def find_prime_list_under_number(number):
if number <= 1:
return []
is_prime = [True] * (number + 1)
is_prime[0] = is_prime[1] = False # 0과 1은 소수가 아님
for i in range(2, int(number ** 0.5) + 1): # 2 ~ 루트(number)까지
if is_prime[i]:
# i가 소수라면, i의 배수들은 모두 소수가 아님
for j in range(i*i, number + 1, i):
is_prime[j] = False
return [i for i, v in enumerate(is_prime) if v]
기존 풀이보다 에라토스테네스의 체 방식이 직관적인 거 같아서 개선해보았습니다. 기존 방식과 지금 방식 중 무엇이 더 효율적인가요?
답변 1
0
안녕하세요 좋은 질문 감사합니다!
말씀주신대로 에라토스테네스의 체 방식이 강의에서 다룬 2차 개선 방식보다 더 효율적입니다!
강의의 2차 개선 방식은 각 숫자 n에 대해 기존에 찾은 소수 목록을 순회하면서 i * i > n 조건으로 조기 종료하는 방식입니다. 이 방식은 숫자마다 나눗셈 연산을 반복합니다.
반면 에라토스테네스의 체는 boolean 배열을 미리 만들어두고, 소수를 발견할 때마다 그 배수들을 한 번에 걸러냅니다. 시간복잡도가 O(N log log N)으로, 나눗셈 기반 방식보다 빠르고 메모리 접근 패턴도 단순합니다. 특히 범위가 클수록 차이가 더 크게 납니다.
작성하신 코드도 정확하게 구현되어 있습니다. i*i부터 시작해서 i 간격으로 배수를 제거하는 부분까지 올바르게 적용하신 것 같습니다!! 새로운 시도 넘 좋습니다 ㅎㅎㅎ 좋은 하루 되시길 바랍니다
수강평 이벤트
0
86
2
코딩테스트 처음인데 이런 공부방법이어도 괜찮을까요
0
169
2
3-3 정렬-2 선택정렬 로직
0
77
2
링크드 리스트 끝에서 k번째 값 출력하기
0
68
2
LinkedList 과제 Fast, slow 포인터
0
68
2
투포인터 시간복잡도
0
82
2
수강평 작성 후 자료
0
75
2
수업교재 링크 오류
2
135
2
프로그래머스에서 제출 후 채점시 틀림ㅠ
0
180
2
1-10 알고리즘 더 풀어보기(2) 질문 있습니다
0
102
2
문제 풀이 방식 관련 질문입니다!
0
112
2
1-5 알고리즘과 친해지기 (2) - 최빈값찾기 질문 있습니다
0
115
2
수업자료 pdf 받고싶습니다
0
136
2
강의 자료 오류 수정
0
92
1
2-10 더하거나 빼거나 관련 질문입니다
0
82
2
3-8 해쉬 -2
0
65
2
Linked List Element Delete Explanation Problem
0
91
2
강의3-4 스택 탑 문제
0
97
2
코드스니펫 입출력 케이스에 오류가 있는것 같아요
0
127
3
링크드 리스트 원소 찾기 구현 방식 질문드립니다.
0
101
2
1874 - 스택 문항
0
95
2
DP Java 예제 자료형 오버플로우 문제
0
123
2
4-9 4주차 숙제중 농심라면 문제
0
143
2
DFS 에서 스택을 사용하는 이유
1
245
3





