글 올린지 1분만에 반박당했다…
그것도 책에게 말이다…
바로 뒤에 최적화 한번 더 한 코드가 있을 줄은 몰랐으니 말이다.
어떤 n의 약수 중 하나가 제곱근 보다 크면 다른 하는 무조건 작다는
간단한 명제로 뛰어난 최적화를 하는 모습을 보니
난 재능이 없는게 아닐까 울적해졌다.
직사각형의 변을 예시로 설명하는 글을 보니 바로 이해가 되어서
더 울적해졌고 말이다…(;´д`)ゞ
여기 아래가 그 코드다.
counter = 0 # 나눗셈 시도 횟수를 세는 변수
ptr = 0 # 소수 리스트에 현재 저장된 소수 개수(=다음 소수의 위치)
prime = [None] * 500 # 최대 500개의 소수를 저장할 리스트(초기값은 None)
prime[ptr] = 2 # 첫 번째 소수 2를 저장
ptr += 1 # 다음 소수 위치로 이동
prime[ptr] = 3 # 두 번째 소수 3을 저장
ptr += 1 # 다음 소수 위치로 이동
for n in range(5, 1001, 2): # 5부터 1000까지 홀수만 검사(짝수는 2 이외에 소수 없음)
i = 1 # 소수 리스트에서 3부터 시작(2는 i=0, 3은 i=1)
while prime[i] * prime[i] <= n: # 소수 prime[i]의 제곱이 n보다 작거나 같을 때까지(=제곱근 이하까지만 나눠봄)
counter += 2 # 나눗셈 시도 카운트(while 조건 1회, if문에서 1회)
if n % prime[i] == 0: # n이 나누어떨어지면 소수 아님
break # 검사 중단
i += 1 # 다음 소수로 이동
else: # while문이 break 없이 끝나면 소수임
prime[ptr] = n # n을 소수 리스트에 추가
ptr += 1 # 소수 개수+1(다음 위치)
counter += 1 # (소수로 판정된 경우 추가로 1회 카운트)
for i in range(ptr): # 찾은 소수만큼 반복
print(prime[i]) # 소수 출력
print("Counter:", counter) # 나눗셈 시도 횟수 출력
말 그대로 간단한 아이디어로 인텔리하게 최적해서 할 말이 없다.
그래도 한 수 배운 셈 치기로 했다.
이제 1대1임 ㅇㅇ;;